Ich versuche, den folgenden Teil über unset
von https://unix.stackexchange.com/a/381782/674
unset
inbash
hebt eine Variable nur auf, wenn sie im aktuellen Bereich deklariert wurde ( lässt es deklariert, außer im globalen Bereich ; es entfernt Attribute und Werte und die Variable ist kein Array oder Hash mehr Beachten Sie, dass bei namerefs die referenzierte Variable deaktiviert wird. Andernfalls wird nur eine variable Ebene aus dem oben genannten Stapel entfernt.
Das Bash-Handbuch erwähnt nichts Ähnliches, oder ich vermisse es.
Können Sie dies anhand von Beispielen für
- erklären? Es wurde im aktuellen Bereich deklariert. „
-
“ lässt es jedoch deklariert, außer im globalen Bereich. „
Wenn
unset
Eine Variable, die sich im lokalen Bereich einer Funktion befindet, ist die Variableunset
, die nicht nur nicht gesetzt, sondern auch nicht deklariert ist.Wenn
unset
Eine Variable, die sich im globalen Bereich befindet, ist die Variableunset
, die nur deaktiviert, aber immer noch deklariert ist.Wie kann ich überprüfen, ob eine Variable vorhanden ist? deklariert oder nicht?
-
„Andernfalls wird nur eine variable Ebene aus dem oben genannten Stapel entfernt.“
Was bedeuten „sonst“ und „eine variable Schicht“?
Danke.
Antwort
Am besten mit Beispielen:
$ bash -c "a=0; f() { local -i a=1; unset a; typeset -p a; a=2; }; f; echo "$a"" declare -- a 0
Das unset
hat eine Variable aufgerufen, die im selben Bereich deklariert wurde. Sie ist ordnungsgemäß deaktiviert. Es ist immer noch deklariert (obwohl es Attribute und Wert verloren hat), es ist immer noch auf diesen Bereich beschränkt. Sie sehen, dass, obwohl wir ein a=2
ausführen, dies immer noch auf einem a
local to f
, der aus dem äußeren Bereich ist nicht betroffen. Das ist gut und was wir wollen.
In:
$ ./bash -c "a=0; f() { local a=1; g; a=2; }; g() { unset a; echo "$a"; }; f; echo "$a"" 0 2
Sie können sehen, dass unset a
hat a
nicht deaktiviert. Stattdessen enthüllte es das darunterliegende, das aus dem äußeren Bereich. Wenn g
zurückgegeben wird, ist die a
-Variable f
nicht mehr lokal.
In Bash 5+ kann dies durch Setzen der Option localvar_unset
behoben werden.
Beachten Sie, dass es in mksh
und yash
wobei unset
das Poppen anstelle von Deaktivieren ausführt auch für Variablen, die im selben Bereich deklariert wurden. Das erste Beispiel mit ihnen gibt:
typeset a=0 2
Weitere Informationen unter: