[gull] bash>for>word

Félix Hauri felix at f-hauri.ch
Thu Sep 30 22:39:01 CEST 2004


On Thu, Sep 30, 2004 at 03:25:20PM +0200, Sebastien Cevey wrote:
> begin Daniel Cordey quotation of Thu, Sep 30, 2004 at 08:41:55AM +0200:
> > Est-ce cela dont tu veux parler ?
> 
> Non, car :
> 
> seb at fawkes foo $ ls -1
> foobar
> hello world
> seb at fawkes foo $ for file in $(ls *); do echo $file; done
> foobar
> hello
> world
> seb at fawkes foo $

On en a parlé. ici, il n'y a pas longtemps :->>
( Le thread au sujet de ``Problèmes char'' )

dumbword]$ /bin/ls -1
foobar
hello word

dumbword]$ for file in *;do echo $file;done
foobar
hello word

fonctionne très bien, mais

dumbword]$ for file in *;do echo "$file";done
foobar
hello word

avec les guillemets, c'est mieux;)

Note que tu peux aussi:
# for file in /home/*/.bash_history;do grep -q "su" $file...

Les abréviations sont très souples essayez de trucs comme:

$ echo */*/*

ou encore 
$ echo */[a-n]*/*


> Ta solution avec le pipe->while permet de contourner le problème de la
> séparation par newline vs. espaces,
Le problème est que ``|while'' génère un fork, cela peut poser un problème
de récupération de variable par le père, ou simplement de ressources.

> tandis qu'un simple for va séparer les champs par des espaces.
Pas du tout, si tu utilise le shell pour trouver les fichiers.

>  On peut modifier IFS, mais je cherchais une astuce similiaire au while qui
> permet de ne pas toucher IFS...

Tu peux aussi modifier IFS localement:

dumbword]$ set | grep IFS
IFS=$' \t\n'

dumbword]$ ( IFS=$'\n';for file in $(/bin/ls -1) ;do echo $file;done )
foobar
hello word

dumbword]$ set | grep IFS
IFS=$' \t\n'

-- 
 Félix Hauri  -  <felix at f-hauri.ch>  -  http://www.f-hauri.ch



More information about the gull mailing list