Învăț scripturi shell prin câteva tutoriale online și am ajuns la următorul script care declară diferențele de variabile globale și locale.
#!/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
Și rezultatul este:
Înainte de apelare funcție: var1 este global 1 : var2 este global 2
Funcția din interior: var1 este local 1 : var2 este global 2
După apel funcție: var1 este global 1 : var2 este modificat din nou
Întrebarea mea …
De ce urmează var1
funcția apel " global 1 " în loc de " s-a schimbat din nou "? Poate cineva să explice?
Răspuns
var1
este declarat local în funcție. Deci, în timpul executării funcției există două variabile numite var1
: una globală și una locală; dar funcția o poate „vedea” doar pe cea locală (cea locală „umbrește” pe cea globală). Deci, în interiorul funcției, orice faceți pentru var1
se face variabilei locale; var1
global nu este deloc atins.
Răspuns
O modalitate de a gândiți-vă la asta este să vă imaginați că local var1="local 1"
are ca efect salvarea valorii actuale a var1
, cu o promisiune că la sfârșitul anului funcția va fi restabilită și apoi setarea la "local 1"
. Cu acest model mental, vă puteți gândi apoi la toate variabilele ca fiind globale, iar variabilele sunt restaurate la sfârșitul funcțiilor.
Exemplul ar fi fost mai bun dacă în loc să apelați ecou atât în interiorul funcției, cât și în afara acesteia numită o altă funcție care a produs 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"
Aici puteți vedea în apelul de bare din interiorul foo preia valoarea v1 stabilită de foo.
O căutare pe web pentru dynamic scope
vs lexical scope
ar putea ajuta.
Comentarii
- " La sfârșitul funcției va fi restaurat ", acest lucru îmi clarifică mintea! Mulțumim
Răspuns
În Bash, variabilele locale trebuie să fie apelate în mod explicit, altfel vor fi tratate ca globale . Chiar și în interiorul funcțiilor (care se aplică domeniul de aplicare).
Și, orice domeniu a fost setat ultima dată pe o variabilă – fie locală, printr-o declarație explicită a cuvântului local
, sau global prin omisiune – va fi ceea ce este returnat în momentul în care este numit prin echo
.
Deci, în exemplul dvs., după ce funcția este apelată, domeniul local este setat pe var1
, astfel încât orice modificare a acestei variabile nu persistă în afara funcției. Dar stațiile globale sunt setate pe var2
, așa că modificările aduse acestei variabile fac.