Menu

Visibilite des variables dans un shell [Fermé]

Haiti - 23 janv. 2003 à 14:19 - Dernière réponse : homer_bdx 6 Messages postés mercredi 27 février 2013Date d'inscription 1 novembre 2017 Dernière intervention
- 1 nov. 2017 à 15:31
Hallu,

J'ai remarqué qu'en Bourne Shell sous unix lorsque je set une variable dans un bloc comme while [ ] -do- ... -done , cette variable n'est pas visible en dehors du bloc. Alors que cela fonctionne dans un if ou un boucle for .
Qui a une idée du pourquoi et comment trouver une solution pour rendre visible ma variable dans le reste de mon shell ???
Afficher la suite 

16 réponses

Meilleure réponse
3
Merci
EDIT : Je n'ai pas trouvé comment modifié mon post précédent... La parenthèse fermante n'était pas bien placée.

C'est un problème de "Père & Fils".
Après le "done", on revient dans le processus principal.
une solution consiste à rester dans le processus fils en ajoutant un jeu de parenthèse.

$ var=rien; cat - | (
while read f
do
var=$f
done
echo $var
)
a
a

--
Tof

Merci Tof 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

CCM a aidé 24302 internautes ce mois-ci

Merci pour l'info.
Je ne m'arracherais plus les cheveux grâce à toi ;)
homer_bdx 6 Messages postés mercredi 27 février 2013Date d'inscription 1 novembre 2017 Dernière intervention - 1 nov. 2017 à 15:31
Super!!!
Un grand merci car moi aussi je galérais sur cet histoire de processus enfant et je ne comprenais pas pourquoi ma variable revenait à sa valeur initiale
1
Merci
C'est un problème de "Père & Fils".
Après le "done", on revient dans le processus principal.
une solution consiste à rester dans le processus fils en ajoutant un jeu de parenthèse.

$ var=rien; cat - | (
while read f
do
var=$f
done
)
echo $var
a
a

--
Tof
0
Merci
Je ne connais pas ce langage mais est ce que ta variable dans ton while do ne serait pas en local. Normalement dan tous les lagages que j'ai appris le while do à les mêmes propriétés de variable que le while ou le for mais bon on sait jamais
Le bourne shell est en fait le shell sh.
J'ai constaté que les variables dans une boucle while ne sont pas visibles à l'extérieur du bloc alors que ca l'ai dans la boucle for.
Le fait que la variable soit globale ou locale ne change rien car j'ai fait un export de celle ci et cela n'a rien fait de plus.
0
Merci
c'est vrai que c'est vraiment bizarre ton truc. Peux tu mettre ta requête au complet pour regarder ça de plus près.
0
Merci
En résumé cela ressemble à ca :

#!/bin/sh

while read line_in
do

if [ $i -eq 1 ]
then
var1="$i.$line_in"
elif [ $i -eq 2 ]
then
var2="$i.$line_in"

etc ...
fi
i=`expr $i + 1`

done < file_in.txt

#Si je fais echo des mes variables var... -> pas de résultat uniquement blank

echo $var1
echo $var2
etc ....


alors que si j'utilises

for line_in in `cat file_in.txt`
do

...
done

Ca marche.
petite remarque: au lieu du set essayez export du genre:
TOTO="Ceci est un bidule"
export TOTO

si vous etes pressé faites:
export TOTO=Ceci est un bidule"

explication:

Quand on a un shebang du genre

debut prog1
#!/bin/sh

...

fin prog1

un environnement est cree de debut prog1 à fin prog1.

set ou export dans ce programme sera local au programme mais inaccessible de l'extérieur du programme(à cause de l'environnement).

En esperant que ceci vous aura un petiy peu eclairé...

Sebastien
0
Merci
est ce qu'il faudra pas faire une concaténation de ta variable avec read

genre

$varline.=line_in

sinon je vois pas
0
Merci
et est ce que l'autre shell ou ca marche pas n'est pas trop ancien ? Je vois pas trop pourquoi mais bon je cherche des solutions
0
Merci
Ca doit être cela , un problème de version d'os.
je travaille sur SUNOS 5.5.1.
Et en effet j'ai essayé sur une machine hp cela fonctionne.
0
Merci
c'est un peu comme le ll qui avant était ls -l sur Linux. J'ai du mal à revenir sur l'ancien Linux au boulot ou le ll marche pas.

c'est bête mon exemple mais comme koi ça évolue tout le temps au niveau des fonctions
En fait, le problème vient du pipe.

f est cahngé en local :
$ f=rien; cat - | while read f; do var=$f; done; echo $f
a
rien

f est changé en globall :
$ f=rien; while read f; do var=$f; done; echo $f
a
a

Maintenant, je ne sais pas non plus comment résoudre le problème, sinon ne pas utiliser de pipe...

=============================

Pour le ll, il s'agit d'un alias préconfiguré ou non. Il suffit d'ajouter au fichier ~/.bashrc la ligne suivante :
alias ll='ls -l'
Corrections, il faut remplacer les 'f' de début et de fin par var (ça m'apprendra à ne pas vérifier avant d'envoyer) :

$ var=rien; cat - | while read f; do var=$f; done; echo $var

et

$ var=rien; while read f; do var=$f; done; echo $var
jisisv 3662 Messages postés dimanche 18 mars 2001Date d'inscriptionContributeurStatut 15 janvier 2017 Dernière intervention - 23 janv. 2003 à 15:20
-1
Merci
Zarbi, j'ai testé chez moi,çàa fonctionne.
[johand@zoot] ~/tmp $i=1 ;while read line_in; do if [ $i -eq 1 ]; then var1="$i.$line_in" ; elif [ $i -eq 2 ]; then var2="$i.$line_in"; fi; i=`expr $i + 1`; done ; echo $var1 $var2
aaa
bbb
1.aaa 2.bbb

Johan
The software said "Requires Windows98, Win2000, or better,
So I installed Unix.