Script shell : probleme avec les variables

Fermé
damien - 9 janv. 2007 à 10:32
pouldo Messages postés 8 Date d'inscription vendredi 1 avril 2005 Statut Membre Dernière intervention 13 janvier 2009 - 10 janv. 2007 à 10:27
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 Date d'inscription vendredi 1 avril 2005 Statut Membre Dernière intervention 13 janvier 2009 3
10 janv. 2007 à 10:27
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 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
9 janv. 2007 à 19:00
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 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
9 janv. 2007 à 19:17
Salut,

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