Was macht unset?

Ich versuche, den folgenden Teil über unset von https://unix.stackexchange.com/a/381782/674

unset in bash 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 Variable unset, die nicht nur nicht gesetzt, sondern auch nicht deklariert ist.

    Wenn unset Eine Variable, die sich im globalen Bereich befindet, ist die Variable unset, 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:

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.