[gull] bash>for>word

Félix Hauri felix at f-hauri.ch
Fri Oct 1 11:42:01 CEST 2004


On Fri, Oct 01, 2004 at 08:48:12AM +0200, Daniel Cordey wrote:
> On Thursday 30 September 2004 22:55, Félix Hauri wrote:
> 
> > Alors pour cela, je recommande le ``set --'' et le ``shift'':
> 
> Ca depend pourquoi tu le recommandes. Pour la lisibilite du code, ...
Plus pour la souplesse, en fait... mait tout se discute!
(Sinon ce ne serait pas une liste de discussions ;-)

> j'en reste a 'while' qui me permet d'ecrire :
> 
> x=${IFS}; IFS=':'
> grep ${USER} /etc/passwd |\
> while read name psswd uid gid dummy desc home shell
> do
>     echo "Your login name is : ${name}\nYour shell is : ${shell}"
> done
> IFS=${x}
Ok, mais là tu génère un fork en dehors duquel tes variables n'existent plus!
(Ou ne sont pas mises à jour)

De plus la boucle ``while ...;do ... ;done'' pour 1 itération peut être évitée
avec des parenthèses, mais de toutes façons: fork. :-/

$ name="dumy init"
    x=${IFS}
    IFS=$'\t:'
    grep ${USER} /etc/passwd | (
        read name dummy uid gid line
        echo -e "Your login name is : ${name}\nYour config line is : ${line}"
    )
Your login name is : felix
Your config line is : Félix Hauri,,,:/divan/userland/felix:/bin/bash

$ echo "name after fork is:'${name}'"
name after fork is:'dumy init'

$ IFS=${x}

> Je pense a ceux qui debutent sous Linux et dans le shell.
Cela aussi peut dérouter des débutants:
  Ou est passé ma variable! :-<

(Au passage, regarder IFS=$'\t:' et pas seulement IFS=':',
 c'est pour une  conversion automatique, ci dessous... )

Alors que:

$ x=${IFS}
    mgid="dumy init"
    IFS=$'\t:'
    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"
    IFS=${x}
uid=12345
gid=10987
config=Félix Hauri,,,   /divan/userland/felix     /bin/bash

Il n'y a pas de fork, mes variables sont bien là.
(De plus, les ``:'' ont été convertis en tabulations au passage ;)

$ echo "Variame name: '$name' et mgid: '$mgid'"
Variame name: 'dumy init' et mgid: '10987'

> Comme ca au matin, shift, set, ... ca doit les surprendre :-)
Désolé ;)

Bonne journée!

$ man bash | wc 
(Ou bonne nuit à ceux qui décideront après cette dernière
  commande de retourner dormir un coup;)

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



More information about the gull mailing list