Script shell : probleme avec les variables

damien -  
pouldo Messages postés 8 Statut Membre -
Bonjour je rencontre un probleme avec un mini bout de script. Je veux lire un fichier (log) ligne par ligne pour construire une grosse commande qui contiendra les parametres lus dans ce fichier. voici mon bout de code :
str=""
cat log_file | while read ligne
do
        str="${str} ${ligne}"
        echo ${str}
done
echo ${str}


le probleme : tout se passe bien dans la boucle while, mais dès que j'en sors, la variable str semble vide.
Ce doit etre tres idiot, mais je ne vois pas...
d'avance merci si qq1 a une idéé.
Damien
A voir également:

3 réponses

pouldo Messages postés 8 Statut Membre 3
 
Si tu fais un pipe, la partie droite est executee dans sous-shell (forcement, puisque les parties droites et gauches doivent s'executer en meme temps). Qu'est-ce que la partie droite de ton pipe ? Tout ce qui est entre le "while" et le "done", compris. Donc tu modifies une variable dans un sous-shell, ce qui ne modifie evidemment pas sa valeur dans le shell pere. Et ton "echo" est dans le shell pere.

Une solution est d'ouvrir un parenthese apres le "|" et de la fermer apres ton dernier "echo". Ca a pour effet de lancer tout le contenu des parentheses dans un sous-shell, plutot que seulement l'expression qui suit le pipe.
1
jipicy Messages postés 41342 Statut Modérateur 4 896
 
Salut,

Tout simplement parce que à la sortie de la boucle, ta variable "$str" a toujours la valeur que tu lui a passée lors de son initialisation, à savoir 'str=""', autrement dit rien.

Pour t'en convaincre, initialise ta variable avec un nom quelconque et tu verras que non seulement ce nom sera inclus en début de chaque ligne "parsée" par ta boucle, mais sera affiché par ta dernière instruction "echo $str" en sortie de boucle.

;-))
0
lami20j Messages postés 21644 Statut Modérateur, Contributeur sécurité 3 570
 
Salut,

et pourquoi pas tout simplement
str=$(cat log_file)
echo $str
0