[gull] bash>for>word

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


On Thu, Sep 30, 2004 at 03:42:36PM +0200, Daniel Cordey wrote:
> Jouer avec le IFS peutr s'averer enquiquinant suivant ce que tu veux faire 
> dans la boucle.
Tu peux aussi utiliser une variable temporaire pour sauver IFS:
OIFS="$IFS";IFS=...; ...;IFS="$OIFS";

Mais de toutes façons, IFS en bash, par défaut c'est:
IFS=$' \t\n'

Soit Espace, Tabulation et Saut-de-Ligne. pas (plus;) très difficile...

> J'utilise systematiquement le 'while' lorsque j'ai une chance 
> d'avoir N (N>1) arguments par ligne. De plus, le while me permet d'assigner 
> chaque argument a un symbole pour chaque ligne et d'avoir, par exemple, toute 
> la fin de la ligne dans le dernier symbole. Par exemple :
> 
> echo 'toto titi tata
> a b c d' |\
> while read x y z
> do
>     echo "[${x}] [${y}] [${z}]"
> done
> 
> Donne :
> 
> [toto] [titi] [tata]
> [a] [b] [c d]

Alors pour cela, je recommande le ``set --'' et le ``shift'':
$ (  IFS=":";
     set -- $(grep $USER /etc/passwd);
     shift;
     shift;
     muid=$1;shift;
     mgid=$1;shift;
     line=$*;
     printf "uid=%s\ngid=%s\nconfig=%s\n" "$muid" "$mgid" "$line"
)
uid=12345
gid=10987
config=Félix Hauri,,,:/divan/userland/felix:/bin/bash

Nota: line=$* et non pas line=$@ pour m'assurer que j'aurrais bien des ``:''
comme séparateurs dans le reste de la ligne:

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



More information about the gull mailing list