Néhány online oktatóanyagon keresztül tanulok shell parancsfájlokat, és eljutottam a következő szkripthez amely deklarálja a globális és lokális változók különbségeit.
#!/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
És a kimenet:
A függvényhívás előtt: var1 globális 1 : var2 globális 2
Belső függvény: var1 helyi 1 : var2 globális 2
A függvényhívás után: var1 global 1 : a var2 ismét megváltozott
Kérdésem …
Miért van a var1
után a " global 1 függvényhívás " a " helyett ismét megváltozott "? Valaki megmagyarázná?
Válasz
var1
a függvény lokálissá nyilvánítva. Tehát a függvény végrehajtása során két változó van, var1
néven: a globális és a helyi; de a függvény csak “láthatja” a lokálisat (a helyi “árnyékolja” a globálisat). Tehát a függvényen belül bármi, amit a var1
érdekében tesz, a helyi változóval történik; a globális var1
egyáltalán nem érinti.
Válasz
Az egyik út gondoljunk csak arra, hogy elképzeljük, hogy a local var1="local 1"
megtakarítja a var1
jelenlegi értékét, azzal az ígérettel, hogy a azt a funkciót, amelyet visszaállít, majd "local 1"
értékre állítja. Ezzel a mentális modellel az összes változó globálisnak tekinthető, és a változók a függvények végén helyreállíthatók.
A példa jobb lett volna, ha ahelyett, hogy visszhangot hívna a függvényen belül és kívül is, hívott egy másik függvényt, amely var
-et adott ki.
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"
Itt láthatja a sávon belüli hívásban a foo belül felveszi a foo által létrehozott v1 értékét.
A dynamic scope
vs lexical scope
keresése segíthet.
Megjegyzések
- " A függvény végén visszaállít ", ez egyértelművé teszi az elmémet! Köszönet
Válasz
A Bash-ban a helyi változókat kifejezetten meg kell hívni, különben globálisként kezelik őket . Még a függvények belsejében is (ahol a hatókör érvényes).
És bármilyen hatókört állítottak be utoljára egy változóra – akár helyi, akár a local
vagy globális kihagyás révén – az lesz az, ami visszaadódik abban az időben, amikor a echo
keresztül hívják.
Tehát, Például a függvény meghívása után a helyi hatókört a var1
értékre állítja be, így ennek a változónak a változása nem marad meg a függvényen kívül. De a globális állapot a var2
állapotban marad, ezért ennek a változónak a változásai igen.