Ein Zeiger (auf einen Speicherort ) ist in keiner höheren Ebene als C ein wirklich nützliches Konzept, sei es in etwa Python oder der Shell. Verweise auf Objekte sind natürlich in Hochsprachen nützlich, möglicherweise sogar zum Aufbau komplexer Datenstrukturen erforderlich. In den meisten Fällen ist das Denken in Speicheradressen jedoch zu niedrig, um sehr nützlich zu sein.
In Bash (und anderen Shells) können Sie die Werte von Array-Elementen mit der ${array[index]}
Notation abrufen, sie mit zuweisen array[index]=...
und die Anzahl der Elemente im Array mit abrufen ${#array[@]}
. Der Ausdruck in Klammern ist ein arithmetischer Ausdruck. Als erfundenes Beispiel könnten wir allen Array-Mitgliedern ein konstantes Präfix hinzufügen:
for ((i=0 ; i < ${#array[@]} ; i++ )) ; do
array[i]="foo-${array[i]}"
done
(Wenn wir uns nur um die Werte und nicht um die Indizes kümmern for x in "${array[@]}" ; do...
würden , wäre das in Ordnung.)
Bei assoziativen oder spärlichen Arrays macht eine numerische Schleife nicht viel Sinn, sondern wir müssten die Array-Schlüssel / -Indizes mit holen ${!array[@]}
. Z.B
declare -A assoc=([foo]="123" [bar]="456")
for i in "${!assoc[@]}" ; do
echo "${assoc[$i]}"
done
Darüber hinaus hat Bash zwei Möglichkeiten, indirekt auf eine andere Variable zu verweisen:
- indirekte Erweiterung mit der
${!var}
Syntax , die den Wert der Variablen verwendet, deren Name in var
und
- namerefs , die mit dem
declare
eingebauten (oder dem ksh
kompatiblen Synonym typeset
) erstellt werden müssen. declare -n ref=var
nimmt ref
auf die Variable Bezug var
.
Namerefs auch Unterstützung Indexierung, dass , wenn wir arr=(a b c); declare -n ref=arr;
dann ${ref[1]}
expandieren b
. Verwenden ${!p[1]}
würde stattdessen p
als Array nehmen und auf die Variable verweisen, die von ihrem zweiten Element benannt wird.
In Bash sind namerefs wörtlich: Verweise nach Namen und die Verwendung eines nameref aus einer Funktion verwenden den lokalen Wert der benannten Variablen. Dies wird gedruckt local value of var
.
#!/bin/bash
fun() {
local var="local value of var"
echo "$ref";
}
var="global var"
declare -n ref=var
fun
BashFAQ hat auch einen längeren Artikel zum Thema Indirektion .