Globální & přiřazení lokální proměnné

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.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *