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

    1. Contributeur
      hello
      pour éviter le sous shell
      while  read ligne ; do
      ...
      done < /home/benj/Listequizz/listequestion.txt
      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 !
        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[@]}

          $