Problème Script bash. Sortir un tableau d'une boucle while !

Résolu
Bonjour,
J'ai un problème que je n'arrive pas à résoudre seul (après 10h de recherche je bloque).
Je veux importer un quizz enregistré dans un fichier texte, puis le stoké dans une variable tableau à l'intérieur du programme jeu.
Je n'arrive pas à sortir une variable tableau d'une boucle while (celle-ci s'exécutant dans un sous-shell).

Voilà la partie du script qui ne marche pas :



recupquizz(){
nbrligne=$(cat /home/benj/Listequizz/listequestion.txt | wc -l)
#récupère le nombre de ligne
(( nbrqr = nbrligne / 2 ))
echo -e $nbrligne
echo -e $nbrqr
cat /home/benj/Listequizz/listequestion.txt | while read ligne ; do
# La première commande va chercher et concatène le fichier.txt et la passe | à la commande suivante.
((i++))
echo $i
echo $ligne
tabrecup[i]=$ligne
# J'essaye de récupérer la totalité du tableau dans cette variable

done

echo ${tabrecup[@]}
# Le tableau n'existe plus en dehors de la boucle while qui tourne dans un sous-shell

}

4 réponses

  1. Contributeur
    Salut,

    Utilise la fonction
    mapfile
    pour construire un tableau à partir d'un fichier ;-))

    $ cat fich 
    Ligne 1
    Ligne 2
    Ligne 3
    Ligne 4
    Ligne 5
    Ligne 6
    Ligne 7
    Ligne 8
    Ligne 9
    Ligne 10

    $ mapfile -O 1 -t tab < fich

    $ echo ${tab[6]}
    Ligne 6

    $ echo ${tab[2]}
    Ligne 2

    3
    1. Contributeur
      hello
      pour éviter le sous shell
      while  read ligne ; do
      ...
      done < /home/benj/Listequizz/listequestion.txt
      0
      1. Merci de vos réponses. Je vais essayer tout ça !
        0
        1. J'ai pas réussi avec while read ligne ; do
          ...
          done < /home/benj/Listequizz/listequestion.txt.
          Les variables ne semblent toujours pas visible à l'extérieur de la boucle.
          En tout cas ça marche avec mapfile. Problème résolu !

          Merci à tous pour vos conseils !
          0
          1. Contributeur
            $ cat txt
            aaa
            bbb
            ccc
            ddd
            $ unset t; while read l; do t[${#t[@]}]=$l; done < txt; printf "%s\n" ${t[@]}
            aaa
            bbb
            ccc
            ddd
            $ unset t; cat txt | while read l; do t[${#t[@]}]=$l; done; printf "%s\n" ${t[@]}

            $
            0