Bash : valeur de var en/hors boucle while

Résolu
IvyAlice Messages postés 379 Date d'inscription   Statut Membre Dernière intervention   -  
IvyAlice Messages postés 379 Date d'inscription   Statut Membre Dernière intervention   -
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   Statut Contributeur Dernière intervention   6 431
 
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   Statut Membre Dernière intervention   32
 
Salut zipe31,

Oui ça fonctionne.
Merci beaucoup

Ivy
0