Bash : valeur de var en/hors boucle while

Résolu/Fermé
Messages postés
379
Date d'inscription
lundi 17 septembre 2007
Statut
Membre
Dernière intervention
14 septembre 2013
-
Messages postés
379
Date d'inscription
lundi 17 septembre 2007
Statut
Membre
Dernière intervention
14 septembre 2013
-
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

Messages postés
36324
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
27 janvier 2021
6 584
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"


;-))
Messages postés
379
Date d'inscription
lundi 17 septembre 2007
Statut
Membre
Dernière intervention
14 septembre 2013
32
Salut zipe31,

Oui ça fonctionne.
Merci beaucoup

Ivy