IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

Bash et les variables locales/globales


Sujet :

Shell et commandes GNU

  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 24
    Points : 22
    Points
    22
    Par défaut Bash et les variables locales/globales
    Bonjour,

    J'ai une petite question concernant les variables locales/globales.

    J'ai un petit script constitué d'un ensemble de fonctions, le truc c'est que tout au long de l'exécution du script on passe d'une fonction à l'autre. On ne sort pas toujours d'une fonction ; il arrive qu'au cours de l'exécution d'une fonction, on en appelle une autre.

    Tout ça pour dire, que je suis un peu embêté car depuis le début j'avais pris pour habitude de déclarer les variables propres à mes fonctions comme des variables locales. Hors il s'avère que celles-ci sont "globales", du au fait que les fonctions sont imbriquées les unes dans les autres je pense.

    Dans un premier temps, j'aimerais savoir si ma réflexion est juste concernant le passage d'une variable locale à "globale".

    Dans un second temps, j'aimerais savoir quel méthode employer pour qu'une variable ne reste pas "globale" ? Faire un unset au début des fonctions ?

  2. #2
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 595
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 595
    Points : 19 477
    Points
    19 477
    Par défaut
    Bonjour,

    une variable locale ne devient pas globale.
    par contre elle n'est visible que pour la fonction dans laquelle elle est définie telle, et les enfants de cette fonction.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ maFonction_1() { local maVar1=toto; maFonction_2; echo "$FUNCNAME : $maVar1";}
    $ maFonction_2() { local maVar1 maVar2=titi; echo "$FUNCNAME : ${maVar1:-"maVar1 n'existe pas ici"} | $maVar2";}
    $ maFonction_1
    maFonction_2 : maVar1 n'existe pas ici | titi
    maFonction_1 : toto

  3. #3
    Nouveau membre du Club
    Inscrit en
    Janvier 2011
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 50
    Points : 38
    Points
    38
    Par défaut
    Bonjour,

    J'avais un peu le même problème que toi, il y a quelques temps. C'était un peu le flou...
    Tout s'est éclairci avec ce sujet :
    http://www.thegeekstuff.com/2010/05/bash-variables/

    Si ça peut t'aider également...
    Bon courage


  4. #4
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 24
    Points : 22
    Points
    22
    Par défaut
    @N_BaH : Oui, globale n'était pas vraiment le bon mot à utiliser, c'est pour ça que je l'ai mis entre guillements. J'entends par là que la variable locale qui a été créée dans une fonction est accessible aussi depuis une autre fonction du au fait que ces fonctions sont imbriquées.

    @Aiglon13 : Merci pour le lien.

    Voici un exemple permettant d'illustrer ce que j'expliquais dans mon premier message :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    function funcA() {
        local varA="True"
        echo $varA" - dans A"
        funcB
    }
    function funcB() {
        local varA
        echo $varA" - dans B"
    }
     
    funcA
    --> Si dans funcB on ne déclare pas varA en local, varA prendra la valeur indiquée dans funcA.

    Ce petit test montre que finalement je me suis fait peur pour rien. Il faut juste faire attention à bien déclarer chaque variable en local (ce que je fais déjà) lorsque on imbrique plusieurs fonctions et que celles-ci utilisent des noms de variables qui sont communs aux diverses fonctions.

    Maintenant j'ai un autre cas un peu plus tordu, où une fonction s'appelle elle-même. Dans ce cas, le fait de déclarer les variables en local va les réinitialiser donc c'est bon. Par contre attention au cas où on utilise une variable globale, il faudra alors faire un unset dessus.

  5. #5
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 102
    Points : 5 849
    Points
    5 849
    Par défaut
    Citation Envoyé par Yokav Voir le message
    Ce petit test montre que finalement je me suis fait peur pour rien. Il faut juste faire attention à bien déclarer chaque variable en local (ce que je fais déjà) lorsque on imbrique plusieurs fonctions et que celles-ci utilisent des noms de variables qui sont communs aux diverses fonctions.

    Maintenant j'ai un autre cas un peu plus tordu, où une fonction s'appelle elle-même. Dans ce cas, le fait de déclarer les variables en local va les réinitialiser donc c'est bon. Par contre attention au cas où on utilise une variable globale, il faudra alors faire un unset dessus.
    Petite remarque de vocabulaire: ce ne sont pas à proprement parler les fonctions qui sont "imbriquées", mais plutôt leurs appels => l'imbrication apparaît dynamiquement lors de l'exécution du programme. Pour info, il existe des langages (comme Pascal, entre autres) où une fonction peut être locale à une autre fonction, ce qui crée une "imbrication lexicale".

    Petite remarque de vocabulaire: le cas dit "un peu plus tordu" où une fonction s'appelle elle-même s'appelle la récursivité... et c'est le cas dit "normal" pour une certaine forme de programmation de certains langages (comme lisp, prolog, etc.). La plupart des langages (sauf FORTRAN, si ma mémoire est bonne) gèrent correctement les variables locales lors d'appels récursifs.

    )jack(

Discussions similaires

  1. Gérer des variables locales/globales
    Par Sweeny94 dans le forum Simulink
    Réponses: 20
    Dernier message: 07/11/2013, 12h34
  2. text, ntext et image sont interdits dans les variables locales
    Par Sebounet19 dans le forum MS SQL Server
    Réponses: 8
    Dernier message: 04/07/2013, 16h44
  3. mémoire occupée par les variables locales
    Par nonozor dans le forum Débuter
    Réponses: 17
    Dernier message: 22/07/2009, 14h31
  4. Variables locale/globale
    Par pydev dans le forum Général Python
    Réponses: 12
    Dernier message: 16/04/2009, 23h19
  5. lire les variables locales à la volée
    Par fedia76 dans le forum VC++ .NET
    Réponses: 1
    Dernier message: 03/09/2007, 10h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo