Japprends le script shell à travers quelques tutoriels en ligne et je suis arrivé au script suivant qui déclare les différences entre les variables globales et locales.
#!/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
Et le résultat est:
Avant lappel de fonction: var1 est global 1 : var2 est global 2
Fonction intérieure: var1 est local 1 : var2 est global 2
Après lappel de la fonction: var1 est global 1 : var2 est modifié à nouveau
Ma question …
Pourquoi var1
est-il après lappel de fonction " global 1 " au lieu de " a de nouveau changé "? Quelquun peut-il expliquer?
La réponse
var1
est déclarée locale dans la fonction. Donc lors de lexécution de la fonction il y a deux variables nommées var1
: la globale et la locale; mais la fonction ne peut « voir » que le local (le local « ombres » le global). Donc, à lintérieur de la fonction, tout ce que vous faites à var1
est fait à la variable locale; le var1
global nest pas du tout touché.
Réponse
Une façon de y penser, cest imaginer que le local var1="local 1"
a pour effet de sauvegarder la valeur actuelle de var1
, avec une promesse quà la fin de la fonction, il sera restauré, puis en le définissant sur "local 1"
. Avec ce modèle mental, vous pouvez alors considérer toutes les variables comme globales et les variables restaurées à la fin des fonctions.
Lexemple aurait été meilleur si au lieu dappeler echo à la fois à lintérieur et à lextérieur de la fonction, il avait appelé une autre fonction qui avait produit 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"
Ici, vous pouvez voir dans lappel à la barre de lintérieur foo ramasse la valeur de v1 qui a été établie par foo.
Une recherche sur le Web pour dynamic scope
vs lexical scope
pourrait aider.
Commentaires
- " À la fin de la fonction, il sera restauré ", cela me rend lesprit clair! Merci
Réponse
Dans Bash, les variables locales doivent être explicitement appelées, sinon elles seront traitées comme globales . Même à lintérieur des fonctions (cest là que sapplique la portée).
Et, quelle que soit la dernière portée définie sur une variable – soit locale, via une déclaration explicite du mot local
, ou global via omission – sera ce qui est renvoyé au moment où il est appelé via echo
.
Donc, dans votre exemple, après lappel de la fonction, la portée locale est définie sur var1
, de sorte que les modifications apportées à cette variable ne persistent pas en dehors de la fonction. Mais global reste défini sur var2
, donc les modifications apportées à cette variable le font.