Signaler

Visibilite des variables dans un shell [Fermé]

Posez votre question Haiti - Dernière réponse le 1 nov. 2017 à 15:31 par homer_bdx
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 ???
Utile
+3
plus moins
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
Guizmo.7- 18 janv. 2009 à 12:49
Merci pour l'info.
Je ne m'arracherais plus les cheveux grâce à toi ;)
homer_bdx 6Messages 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
Répondre
Utile
+1
plus moins
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
Utile
+0
plus moins
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
Haiti- 23 janv. 2003 à 14:43
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.
Utile
+0
plus moins
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.
Utile
+0
plus moins
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.
sebush- 17 oct. 2008 à 16:55
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
Utile
+0
plus moins
est ce qu'il faudra pas faire une concaténation de ta variable avec read

genre

$varline.=line_in

sinon je vois pas
Utile
+0
plus moins
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
Utile
+0
plus moins
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.
Utile
+0
plus moins
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
Anc- 22 nov. 2007 à 12:10
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'
Anc- 22 nov. 2007 à 12:14
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
Utile
-1
plus moins
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.

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !