[gull] Truc et astuces: Jouons avec ``eval'' et bash

Félix Hauri felix at f-hauri.ch
Sat Oct 6 14:10:14 CEST 2007


On Sat, Oct 06, 2007 at 11:33:01AM +0200, Gregoire Galland wrote:

> Heu... pas tout compris à ton script,
> 
Hem ce sont des lignes, à copier *sans* le ``$'' (qui repère le prompt).

> il me fait des erreur d'exécution.
A quel moment (ligne)?

> Félix Hauri wrote:
> > $ echo $str
> >
> >
> > $ str=$(eval echo -e $(printf '\\\\%o,' $(seq 65 90)) |
> >         sed 's/^/{/;s/,$/}/')
> >
> > $ echo $str
> > {A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z}
> >
> > $ eval echo $str
> > A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
> >
> > $ eval "printf '%s\n' $str\ $str\ $str" | wc
> >   17576   52728  105456
> >
> > $ echo 'a=26^3;a;a*3;a*6' | bc -l | xargs printf "%7d %7d %7d\n"
> >   17576   52728  105456
> >
> > $ eval "printf '%s\n' $str\ $str\ $str\ $str"
> >
> Pour le problème dont je t'avais parlé l'autre soir (problème
> d'exécution de commande dans un script), j'ai trouvé le bug: je
> manipulais la variable d'environnement $IFS, et c ça qui foutait la merde.
:->

C'est autant rigolo que délicat de jouer avec IFS. Personellement,
j'essaie de systématiquement `èncapsuler'' les séquences dans
lesquelles je prend ce genre de risques dans un sous-shell, défini
entre parenthèses, afin de conserver mon environnement en dehors.

Pour jouer avec IFS:
$ str=$(eval "echo -e '{$(printf '\%o,' $(seq 65 90)|sed s/,$//)}'")

$ liste=($(eval echo $str$str))

$ (export IFS=','; echo "${liste[*]}")
AA,AB,AC,AD,AE,AF,AG,...
...
...,ZV,ZW,ZX,ZY,ZZ

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



More information about the gull mailing list