Sto imparando lo scripting della shell tramite alcuni tutorial online e sono arrivato al seguente script che dichiara le differenze di variabili globali e locali.
#!/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
E loutput è:
Prima della chiamata di funzione: var1 è globale 1 : var2 è globale 2
Funzione interna: var1 è locale 1 : var2 è globale 2
Dopo la chiamata di funzione: var1 è global 1 : var2 è cambiato di nuovo
La mia domanda …
Perché var1
dopo la chiamata di funzione " global 1 " invece di " è cambiata di nuovo "? Qualcuno può spiegare?
Risposta
var1
è dichiarato locale nella funzione. Quindi durante lesecuzione della funzione ci sono due variabili denominate var1
: quella globale e quella locale; ma la funzione può solo “vedere” quella locale (quella locale “ombreggia” quella globale). Quindi allinterno della funzione tutto ciò che fai a var1
viene fatto alla variabile locale; la var1
globale non viene toccata affatto.
Risposta
Un modo per pensarci è immaginare che local var1="local 1"
abbia leffetto di salvare il valore corrente di var1
, con la promessa che alla fine del la funzione verrà ripristinata, quindi impostandola su "local 1"
. Con questo modello mentale puoi quindi pensare a tutte le variabili come globali e le variabili vengono ripristinate alla fine delle funzioni.
Lesempio sarebbe stato migliore se invece di chiamare echo sia allinterno che allesterno della funzione avesse ha chiamato unaltra funzione che aveva prodotto 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"
Qui puoi vedere nella chiamata a bar dallinterno di foo che prende il valore di v1 che è stato stabilito da foo.
Una ricerca sul Web per dynamic scope
e lexical scope
potrebbe aiutare.
Commenti
- " Alla fine della funzione verrà ripristinata ", questo mi fa chiarezza! Grazie
Risposta
In Bash, le variabili locali devono essere chiamate esplicitamente, altrimenti verranno trattate come globali . Anche allinterno delle funzioni (che è dove si applica lambito).
E, qualunque ambito sia stato impostato per ultimo su una variabile, locale, tramite una dichiarazione esplicita della parola local
, o globale tramite omissione – sarà ciò che viene restituito nel momento in cui viene chiamato tramite echo
.
Quindi, in nel tuo esempio, dopo che la funzione è stata chiamata, lambito locale è impostato su var1
, quindi qualsiasi modifica a questa variabile non persiste al di fuori della funzione. Ma il valore globale rimane impostato su var2
, quindi le modifiche a questa variabile lo fanno.