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 .
for foo in "${array[@]}" ; do ... done
sei denn, Sie benötigen den Index für andere Zwecke.Nein,
bash
hat keine "Zeiger", aber Referenzen:Von der
bash
Manpage:quelle
Nein, Shells verwenden keine "Zeiger" (wie in C verstanden).
Arrays könnten Indizes verwenden:
echo "${array[2]}"
aber das@
in Ihrem Beispiel ist nicht wirklich ein "Zeiger". Es ist eine Möglichkeit, "die Liste der Array-Werte" auszudrücken. Etwas, das der Shell-Parser versteht. Ähnlich wie bei a:wird auf alle "Positionsparameter" -Listen erweitert.
quelle
Während Bash Integer indizierte Arrays definiert werden können und iterativ wie folgt zugegriffen werden kann;
Assoziative oder stringbasierte indizierte Arrays in bash erfordern die folgende iterative Definition.
Um die Frage nach Zeigern zu beantworten und einen von bash zu verwenden; Die interne Funktionalität der kompilierten Bash-Binärdatei verwendet in der Tat Zeiger auf den auf dem Stapel zugewiesenen Speicher und stellt eine ähnliche Funktionalität unter Verwendung von bereit
eval
. Siehe [indirekte Verweise] http://tldp.org/LDP/abs/html/ivr.html )Es gibt Drachen; Die Verwendung von
eval
sollte aus Sicherheitsgründen mit Vorsicht erfolgenquelle