Global & lokal variabel tildeling

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.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *