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

Linux Discussion :

[shell][débutante] portée d'une variable


Sujet :

Linux

  1. #1
    Membre du Club
    Inscrit en
    Juin 2003
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 55
    Points : 41
    Points
    41
    Par défaut [shell][débutante] portée d'une variable
    Bonjour,

    j'ai une petite question qui va surement vous sembler simple, mais n'oublier pas que je suis une débutante ^^

    Je vous expose mon petit problème :
    Dans mon script, j'ai une variable, que j'appelle $bool. Je l'initialise à "true". Par la suite, j'ai une boucle do [...] done. dans cette boucle, je modifie ma variable $bool et je lui attribue "false".

    Si j'essaie d'afficher ma variable 1) après initialisation, 2) après le changement dans la boucle et 3) après être sorti de ma boucle, il m'affiche :
    "True, False, True"

    Autrement dit, il ne semble pas conserver la modification de ma variable dans ma boucle, une fois sortie de celle ci. Et j'aurais donc besoin qu'il la conserve. Autrement dit, qu'il m'affiche "True, False, False".

    Savez vous comment je pourrais m'y prendre ? Merci

  2. #2
    Membre du Club
    Inscrit en
    Juin 2003
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 55
    Points : 41
    Points
    41
    Par défaut
    Bonjour,

    Après avoir fait quelques tests je me suis rendue compte que normalement, la modification de ma variable $bool devrait être conservée, meme après la boucle. Mon probleme vient donc directement de mon script et non de la portée de ma variable.

    Par contre, je sèche un peu et je ne vois pas du tout d'ou ça peut venir. Je vous montre donc mon script, avec l'espoir que l'un d'entre vous sache d'ou provient mon problème. J'ai énormément épuré mon script, car il contient beaucoup de requetes sur des bases de données. J'ai donc directement attribuer une valeur bidon à chacune des variables récupérant le résultat de mes requetes. Mon erreur est toujours présentes, meme sans l'execution de ces requetes.

    mon script épuré :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    coupeAIGUIBis="2587:G035874:::; "
    deleteDest="true"
    echo "deleteDest : $deleteDest" 
     
    #pour chaque enregistrement 
    echo $coupeAIGUIBis | awk ' BEGIN { RS=";"; } { print $0; } ' | while read enregistrement
    do
     
    	codeEntiteOK="true"
    	if [ $enregistrement ]
    	then
    		#Récupération de chaque élément de la ligne d'enregistrement
    		idAigui=$( echo $enregistrement | awk  ' BEGIN { FS=":"; } { print $1 ;} ' )
    		code_entite=$( echo $enregistrement | awk  ' BEGIN { FS=":"; } { print $2 ;} ' )
     
     
    		if [ $code_entite ]
    		then
    			#Récupération de la première lettre du code 
    			first=${code_entite:0:1}
    			#si la lettre est G, on cherche la correspondance via la table XXX
    			if [ $first = "G" ]
    			then
    				coupeCodeG="BLA BLA BLA"
     
    				#mise à jour de codeEntiteOK
    				if [ ! "$coupeCodeG" ]
    				then
    					codeEntiteOK="false"
    				fi
    			fi
    			#si la lettre est N, on cherche la correspondance via la table YYY
    			if [ $first = "N" ]
    			then
     
    				coupeCodeN="BLA BLA BLA 2"
     
    				#mise à jour de codeEntiteOK
    				if [ ! "$coupeCodeN" ]
    				then
    					codeEntiteOK="false"
    				fi
     
    			fi 
    			#si la lettre est T, on cherche la correspondance via les tables XXX et ZZZ
    			if [ $first = "T" ]
    			then
     
    				coupeVerifSiren="456848"
     
     
    				coupeVerifNic="216578"
     
     
    				coupeVerifCodeT="BLABLABLA 3"
     
     
    				#mise à jour de codeEntiteOK
    				if [ ! "$coupeVerifSiren" -o ! "$coupeVerifNic" -o ! "$coupeVerifCodeT" ]
    				then
    					codeEntiteOK="false"
    				fi
    			fi
     
    		fi
     
     
     
    		#l'enregistrement est il correct ?
    		if [ $codeEntiteOK = "false" ]
    		then
    			echo "Au moins une donnée de l'enregistrement n'a pas été trouvé " 
    		else
    			#l'enregistrement est correct
    			echo "l'enregistrement est correct" 
    			deleteDest="false"
    			echo "deleteDest (après modif ) : $deleteDest" 
    		fi
    		echo "----" 
     
    	echo "Avant done deleteDest : $deleteDest" 
    	fi
    done
    echo "Apres done, deleteDest : $deleteDest"
    et voici ce qu'il m'affiche :
    deleteDest : true
    l'enregistrement est correct
    deleteDest (après modif ) : false
    ----
    Avant done deleteDest : false
    Apres done, deleteDest : true
    Comme vous pouvez le voir, ma variable repasse à true une fois sortie de la boucle do ... done

    Si vous avez une idée, une piste, je suis preneuse.

    Merci d'avance

  3. #3
    Membre du Club
    Inscrit en
    Juin 2003
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 55
    Points : 41
    Points
    41
    Par défaut
    Bien, après quelques recherches un peu plus fructueuses... j'ai la solution.

    Pour ceux que ça interresse, mon problème provient en fait du "| while read enregistrement " qui lance un processus fils. Et c'est la que ça fout le bazare !!

    Bref, pour ressoudre le problème, il faut mettre un parenthèse ouvrante juste avant le while et la fermer après la dernière utilisation de la variable, comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    coupeAIGUIBis="2587:G035874:::;"
    deleteDest="true"
    echo "deleteDest : $deleteDest" 
    
    #pour chaque enregistrement 
    echo $coupeAIGUIBis | awk ' BEGIN { RS=";"; } { print $0; } ' | (while read enregistrement
    do
    
          [...]
    
    done
    echo "Apres done, deleteDest : $deleteDest" )

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 27
    Points : 27
    Points
    27
    Par défaut
    edit : OUPS GRILLE , enfin cool pour l'astuce des "()" ca me serviras surement !
    edit2: OK en fait avec les "()" , tu reste dans le sous-shell (niveau 1) dans ta variable locale existe encore donc vaut false . mais bon apres la parenthese on reviens au niveau 0 et termine le sous shell , donc la variable ,et de nouveau la ariable globale et vaut true.



    salut ,

    a mon avis le "|" pipe creer un sous -shell ,
    donc ta variable est une autre variable locale dans le sous shell et donc tu ne peux pas la reprendre dans ton shell parent .

    en bash par exemple , tu peux utiliser la variable interne
    $BASH_SUBSHELL pour indiquer le niveau d'imbrication des sous-shells

    cf : http://abs.traduc.org/abs-4.2.01-fr/ch20.html

    maintenant pour recupere ton flag ,je vois pas trop comment faire ,
    a moins d' un truc bourrin comme creer un fichier temporaire quand cela passe a false et tester a la sortie de ta boucle si le fichier existe alors mettre la variable a false .

    maintenant , il ya surment qqun ici qui aura une meilleur idee

    bonne chance

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    test
    deleteDest : true
     $BASH_SUBSHELL dans le sous-shell = 0
     $BASH_SUBSHELL dans le sous-shell = 1
    Avant done deleteDest : true
     $BASH_SUBSHELL dans le sous-shell = 1
    l'enregistrement est correct
    deleteDest (apr�s modif ) : false
    ----
    Avant done deleteDest : false
     $BASH_SUBSHELL dans le sous-shell = 1
    Avant done deleteDest : false
     $BASH_SUBSHELL dans le sous-shell = 1
    Avant done deleteDest : false
     $BASH_SUBSHELL dans le sous-shell = 0
    Apres done, deleteDest : true

  5. #5
    Membre du Club
    Inscrit en
    Juin 2003
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 55
    Points : 41
    Points
    41
    Par défaut
    Citation Envoyé par 7not6
    edit2: OK en fait avec les "()" , tu reste dans le sous-shell (niveau 1) dans ta variable locale existe encore donc vaut false . mais bon apres la parenthese on reviens au niveau 0 et termine le sous shell , donc la variable ,et de nouveau la ariable globale et vaut true.
    oui, c'est vrai, mais c'est pour ça qu'il faut refermer la parenthèse après la dernière utilisation de la variable.

    De toute manière, moi je l'ai ouvert quasiement au début et je la referme à la fin, donc pas de soucis ^^

    En tout cas, merci de ton aide ^^

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Débutant] Passage d'une variable à une popup
    Par kiolol dans le forum Langage
    Réponses: 5
    Dernier message: 13/09/2006, 10h19
  2. [XSLT] pb portée d'une variable
    Par NPortmann dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 23/05/2006, 15h53
  3. Portée d'une variable globale
    Par Giill dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 27/12/2005, 10h13
  4. Réponses: 5
    Dernier message: 25/06/2005, 11h35
  5. [débutant][xsl]incrémenter une variable
    Par guitalca dans le forum XSL/XSLT/XPATH
    Réponses: 6
    Dernier message: 01/04/2003, 15h19

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