[gull] bash>for>word

Marc SCHAEFER schaefer at alphanet.ch
Fri Dec 5 13:41:01 CET 2003


On Fri, Dec 05, 2003 at 01:11:25PM +0100, BRINER Cedric wrote:
> mais le problème est que le `for' interprète les espaces des artistes: 

Faisons une expérience:

   schaefer at defian:/tmp/tt% mkdir abcd "un repertoire etrange" "truc"
   schaefer at defian:/tmp/tt% for i in *; do echo $i; done
   abcd
   truc
   un repertoire etrange
   schaefer at defian:/tmp/tt% date > un\ repertoire\ etrange/bla
   schaefer at defian:/tmp/tt% date > abcd/t1
   schaefer at defian:/tmp/tt% for i in *; do echo $i; for j in "$i"/*; do echo "   $j"; wc -c "$j"; done; done
   abcd
      abcd/t1
        29 abcd/t1
   truc
      truc/*
   wc: truc/*: No such file or directory
   un repertoire etrange
      un repertoire etrange/bla
        29 un repertoire etrange/bla

La variable i est bien correctement assignée. Et le reste fonctionne
aussi, tant qu'on utilise des guillemets.

Ton problème est la boucle for interne. Mais il y a deux contraintes
incompatibles:

   - il faut éviter l'interprétation des espaces
   - il faut étendre les jokers *

J'aurais écrit ton script ainsi:

for artist in /mp3/*
do
   for album in "$artist"/*
   do
      ./script "$artist $album"
   done
done

Mais il est clair qu'on arrive aussi aux limites du shell. Le langage
Perl offre des fonctions sécurisées -- en particulier l'open() à 3
arguments (handle, mode, nom).

Sinon on peut aussi utiliser les options -0 ou print0 de diverses
commandes comme find, xargs, grep, etc, qui terminent les noms de
fichiers par des ASCII 0 (NUL) plutôt qu'avec des séparateurs.

   find /mp3 -type f -print0 | xargs -0 -n1 ./script

> simplement une variable du bash qui gere ca?

Il y a bien l'Input Field Separator (IFS), mais je ne jouerais pas
avec ça.




More information about the gull mailing list