Bash : valeur de var en/hors boucle while

Résolu/Fermé
IvyAlice Messages postés 379 Date d'inscription lundi 17 septembre 2007 Statut Membre Dernière intervention 14 septembre 2013 - 26 mai 2011 à 16:27
IvyAlice Messages postés 379 Date d'inscription lundi 17 septembre 2007 Statut Membre Dernière intervention 14 septembre 2013 - 23 juin 2011 à 15:57
Bonjour à tous,

Petite question par rapport à un bout de code
 [code tronqué]
  lignefich="${g:4}"  #commence la variable avec le nom de fichier
  cat /tmp/$g |        #parcourt les lignes du fichier /tmp/g
  while read u
  do
    lignefich="$lignefich ; $u"   # ma variable = elle-même + la ligne du fichier
    echo "ligne est mnt: $lignefich"
  done
  echo "le resultat final pour lignefich : $lignefich"


voilà en gros je veut mettre dans 1 variable un nom de fichier + toutes les lignes qu'il contient, pour, à la fin, mettre tout ça dans un autre fichier, et avoir ce contenu sur une seule ligne.(le but c'est de faire un .csv avec chaque fois le nom d'un groupe et sur la même ligne tous les users qui sont dedans, mais bref c'est pas important)

donc dans la boucle, tout se fait juste, $lignefich est chaque fois égale à elle-même + la dernière valeur rajoutée.
par contre après le "done", $lignefich ne contient plus que ce qu'il contenait AVANT d'être passé dans la boucle.

Est-ce que la boucle fait son truc dans un genre de sous-shell ?

Comment faire pour éviter cela ?

Merci d'avance pour vos conseils et suggestions.

Ivy


2 réponses

zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
26 mai 2011 à 17:51
Salut,

C'est la faute au "pipe" ( | ) qui crée un sous-shell (shell fils) et de ce fait les variables ne sont pas importées en dehors et ne remontent donc pas chez le père ;-(

Pour palier à ce problème il faut éviter le "pipe" en faisant un :

while read u
  do
    lignefich="$lignefich ; $u" 
    echo "ligne est mnt: $lignefich"
  done < /tmp/${g}
  echo "le resultat final pour lignefich : $lignefich"


;-))
1
IvyAlice Messages postés 379 Date d'inscription lundi 17 septembre 2007 Statut Membre Dernière intervention 14 septembre 2013 32
23 juin 2011 à 15:57
Salut zipe31,

Oui ça fonctionne.
Merci beaucoup

Ivy
0