Forum Programmation.shell les tableaux bash et les boucles while

Posté par  (site web personnel) .
Étiquettes : aucune
0
6
avr.
2007

Salut,



J'essaie de lire le contenu d'un répertoire avec des fichiers possédant potentiellement des espaces pour les mettre dans un tableau. J'ai fait des tests mais il y a quelque chose que je ne comprend pas.



J'initialise d'abord un tableau et crée une fonction pour afficher un élément du tableau par ligne (même si les éléments contiennent des espaces) :



tab=()

display(){
for i in "$@"; do
echo "$i"
done
}


maintenant je fais une boucle pour me collecter tous les fichiers d'un répertoire donné :



i=0

find . -maxdepth 1 -type f | cut -d/ -f2- | while read file; do
tab[$i]="$file"
echo "tab[$i] = ${tab[$i]}"
i=$(($i+1))
done


Cela me donne



tab[0] = .bash_history

tab[1] = .xsession-errors
tab[2] = .dmrc
tab[3] = .Xauthority
tab[4] = .ICEauthority
tab[5] = .gtkrc-1.2-gnome2
tab[6] = .gksu.lock
tab[7] = .lesshst
tab[8] = .viminfo
tab[9] = t o t o
tab[10] = .recently-used.xbel
tab[11] = .mcoprc
tab[12] = .mysql_history
tab[13] = .bzr.log


mais pourtant la commande suivante ne m'affiche rien



display "${tab[@]}"


Quelqu'un saurait m'explique où ça coince ? je pense que c'est au niveau du find que je pipe dans le while mais je ne vois pas pourquoi cela ne fonctionnerait pas ... et je ne vois pas de manière de faire autrement si j'ai des fichiers avec des espaces.



Merci


Mildred

  • # sous shell

    Posté par  (site web personnel) . Évalué à 2.

    Je pense que le problème est que la variable tab que tu affiches et la variable tab que tu passes à la fonction display n'est pas la même!
    Le while do ... done lance un sous shell, la variable tab affecté dans ce sous shell n'est pas accessible en dehors, dans ton exemple c'est une nouvelle variable non initialisé qui est passé à la fonction display.
    Regarde http://abs.traduc.org/abs-4.2.01-fr/ch20.html pour plus d'info.
    En dehors de ça la syntaxe semble correcte.
  • # Mon idée

    Posté par  . Évalué à 5.

    ton problème vient du fait que tu fais une affectation au sein d'une boucle while ce qui en soit est correct, mais en bash ta construction génère un sous-shell qui exécute la boucle.

    Bilan, dès que tu sors de la boucle, ton tableau est vide.

    Je suis régulièrement confronté à ce problème et la manière de le contourner est celle-ci :


    i=0

    while read file; do
    tab[$i]="$file"
    echo "tab[$i] = ${tab[$i]}"
    i=$(($i+1))
    done << EOF
    `find . -maxdepth 1 -type f | cut -d/ -f2`
    EOF
    • [^] # Re: Mon idée

      Posté par  (site web personnel) . Évalué à 2.

      merci beaucoup pour vos réponses ...
      Je me doutais bien qu'il avait une histoire de sous-shell par derrière mais je ne savais pas comment m'en sortir, ta solution a été la bonne.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.