& attribution de variable locale globale

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.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *