Jeg lærer shell scripting gennem nogle online tutorials og jeg kom til følgende script der erklærer forskelle mellem globale og lokale variabler.
#!/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
Og output er:
Før funktionsopkald: var1 er global 1 : var2 er global 2
Indvendig funktion: var1 er lokal 1 : var2 er global 2
Efter funktionsopkald: var1 er global 1 : var2 er ændret igen
Mit spørgsmål …
Hvorfor er var1
efter funktionsopkaldet " global 1 " i stedet for " ændret igen "? Kan nogen forklare?
Svar
var1
erklæres lokal i funktionen. Så under udførelsen af funktionen er der to variabler med navnet var1
: den globale og den lokale; men funktionen kan kun “se” den lokale (den lokale “skygger” den globale). Så inden i funktionen gøres alt, hvad du gør for at var1
til den lokale variabel; det globale var1
berøres slet ikke.
Svar
En måde at tænk på det er at forestille sig, at local var1="local 1"
har den effekt, at den aktuelle værdi på var1
gemmes med et løfte om, at i slutningen af funktionen gendannes og derefter indstille den til "local 1"
. Med denne mentale model kan du så tænke på alle variabler som globale og variabler, der gendannes i slutningen af funktioner.
Eksemplet ville have været bedre, hvis det i stedet for at kalde ekko både inde i funktionen og udenfor havde kaldte en anden funktion, der havde sendt 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"
Her kan du se i opfordringen til bjælke indefra foo opfanger værdien af v1, der blev oprettet af foo.
En websøgning efter dynamic scope
vs lexical scope
kan hjælpe.
Kommentarer
- " I slutningen af funktionen gendannes den ", dette gør mig klar! Tak
Svar
I Bash skal lokale variabler udtrykkeligt kaldes, ellers vil de blive behandlet som globale . Selv inden for funktioner (hvilket er hvor omfanget gælder).
Og uanset hvilket omfang, der sidst blev indstillet på en variabel – enten lokal, via en eksplicit erklæring af ordet local
eller global via udeladelse – bliver det, der returneres på det tidspunkt, det kaldes via echo
.
Så i dit eksempel, efter at funktionen er kaldt, indstilles lokalt omfang til var1
, så ændringer i denne variabel forbliver ikke uden for funktionen. Men globalt forbliver indstillet på var2
, så ændringer til denne variabel gør.