Učím se skriptování shellu prostřednictvím několika online návodů a přišel jsem k následujícímu skriptu který deklaruje rozdíly globálních a lokálních proměnných.
#!/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
A výstup je:
Před voláním funkce: var1 je global 1 : var2 is global 2
Vnitřní funkce: var1 je místní 1 : var2 is global 2
Po volání funkce: var1 je global 1 : var2 je znovu změněn
Moje otázka …
Proč var1
poté volání funkce " globální 1 " místo " se znovu změnilo "? Může někdo vysvětlit?
Odpověď
var1
je ve funkci deklarována jako místní. Během provádění funkce tedy existují dvě proměnné s názvem var1
: globální a místní; ale funkce může pouze „vidět“ místní (místní „stínuje“ globální). Takže uvnitř funkce je vše, co uděláte var1
, provedeno s místní proměnnou; globální var1
se vůbec nedotkne.
Odpověď
Jedním ze způsobů, jak je třeba si představit, že local var1="local 1"
má za následek uložení aktuální hodnoty var1
s příslibem, že na konci funkce, která bude obnovena, a poté ji nastavte na "local 1"
. S tímto mentálním modelem pak můžete všechny proměnné považovat za globální a proměnné se obnovují na konci funkcí.
Příklad by byl lepší, kdyby místo volání echa uvnitř i vně funkce zavolal jinou funkci, která vygenerovala var
.
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"
Zde můžete vidět, že ve volání baru zevnitř foo získává hodnotu v1, kterou stanovil foo.
Může pomoci vyhledávání na webu dynamic scope
vs lexical scope
.
Komentáře
- " Na konci této funkce bude obnovena ", to mi vyjasní mysl! Děkujeme
Odpověď
V Bash musí být lokální proměnné výslovně nazývány, jinak se s nimi bude zacházet jako s globálními . Dokonce i uvnitř funkcí (na které se rozsah vztahuje).
A jakýkoli rozsah byl naposledy nastaven na proměnnou – buď lokální, prostřednictvím explicitní deklarace slova local
nebo globální přes vynechání – bude to, co se vrátí v době, kdy se volá přes echo
.
Takže v váš příklad, po vyvolání funkce je místní obor nastaven na var1
, takže žádné změny této proměnné nebudou přetrvávat mimo funkci. Globální pobyty jsou ale nastaveny na var2
, takže změny této proměnné ano.