Ich lerne Shell-Scripting in einigen Online-Tutorials und bin zum folgenden Skript gekommen das deklariert Unterschiede zwischen globalen und lokalen Variablen.
#!/bin/bash # Experimenting with variable scope var_change () { local var1="local 1" echo Inside function: var1 is $var1 : var2 is $var2 var1="changed again" var2="changed again" } var1="global 1" var2="global 2" echo Before function call: var1 is $var1 : var2 is $var2 var_change echo After function call: var1 is $var1 : var2 is $var2
Und die Ausgabe lautet:
Vor dem Funktionsaufruf: var1 ist global 1 : var2 ist global 2
Innerhalb der Funktion: var1 ist lokal 1 : var2 ist global 2
Nach Funktionsaufruf: var1 ist global 1 : var2 wird erneut geändert
Meine Frage …
Warum ist var1
danach Der Funktionsaufruf " global 1 " anstelle von " wurde erneut geändert "? Kann jemand erklären?
Antwort
var1
wird in der Funktion als lokal deklariert. Während der Ausführung der Funktion gibt es also zwei Variablen mit dem Namen var1
: die globale und die lokale; Die Funktion kann jedoch nur die lokale „sehen“ (die lokale „beschattet“ die globale). Innerhalb der Funktion wird also alles, was Sie mit var1
tun, mit der lokalen Variablen ausgeführt. Die globale var1
wird überhaupt nicht berührt.
Antwort
Ein Weg zu Stellen Sie sich vor, Sie möchten sich vorstellen, dass local var1="local 1"
den aktuellen Wert von var1
speichert, mit dem Versprechen, dass am Ende von Die Funktion wird wiederhergestellt und anschließend auf "local 1"
gesetzt. Mit diesem mentalen Modell können Sie sich dann alle Variablen als global vorstellen und Variablen am Ende von Funktionen wiederherstellen.
Das Beispiel wäre besser gewesen, wenn Sie nicht das Echo sowohl innerhalb als auch außerhalb der Funktion aufgerufen hätten rief eine andere Funktion auf, die var
ausgegeben hatte.
bash$ show(){ printf " The value of %s in %s is "%s"\n" $1 $2 ${!1} ; } bash$ bar(){ show v1 bar_$1 ; } bash$ foo(){ show v1 before_foo ; local v1 ; show v1 after_local ; \ v1="changed"; show v1 after_change ; bar via_foo ; } bash$ v1="global" bash$ show v1 global_scope The value of v1 in global_scope is "global" bash$ foo The value of v1 in before_foo is "global" The value of v1 in after_local is "" The value of v1 in after_change is "changed" The value of v1 in bar_via_foo is "changed" bash$ bar direct The value of v1 in bar_direct is "global" bash$ show v1 global_scope The value of v1 in global_scope is "global"
Hier können Sie im Aufruf von bar von innen sehen, dass foo den von foo festgelegten Wert von v1 aufnimmt.
Eine Websuche nach dynamic scope
vs lexical scope
kann hilfreich sein.
Kommentare
- " Am Ende der Funktion wird sie wiederhergestellt. ", das macht meine Meinung klar! Danke
Antwort
In Bash müssen lokale Variablen explizit aufgerufen werden, sonst werden sie als global behandelt . Sogar innerhalb von Funktionen (wo der Gültigkeitsbereich gilt).
Und welcher Gültigkeitsbereich zuletzt für eine Variable festgelegt wurde – entweder lokal, über eine explizite Deklaration des Wortes local
oder global über Auslassung – wird zum Zeitpunkt des Aufrufs über echo
zurückgegeben.
Also, in In Ihrem Beispiel wird nach dem Aufrufen der Funktion der lokale Bereich auf var1
festgelegt, sodass Änderungen an dieser Variablen außerhalb der Funktion nicht bestehen bleiben. Global bleibt jedoch auf var2
festgelegt, sodass Änderungen an dieser Variablen vorgenommen werden.