Visibilite des variables dans un shell

Fermé
Haiti - 23 janv. 2003 à 14:19
homer_bdx Messages postés 6 Date d'inscription mercredi 27 février 2013 Statut Membre Dernière intervention 1 novembre 2017 - 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 ???
A voir également:

10 réponses

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
3
Merci pour l'info.
Je ne m'arracherais plus les cheveux grâce à toi ;)
0
homer_bdx Messages postés 6 Date d'inscription mercredi 27 février 2013 Statut Membre Dernière intervention 1 novembre 2017
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
0
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
1
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
0
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
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
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.
0
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
est ce qu'il faudra pas faire une concaténation de ta variable avec read

genre

$varline.=line_in

sinon je vois pas
0
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
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
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
0
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'
0
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
0
jisisv Messages postés 3645 Date d'inscription dimanche 18 mars 2001 Statut Modérateur Dernière intervention 15 janvier 2017 934
23 janv. 2003 à 15:20
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.
-1