[gull] Truc et astuces: bash: jouons avec les variables et eval

Arnaud listes.00 at gmail.com
Sun Nov 6 18:11:43 CET 2011


Le 02. 11. 11 15:26, Félix Hauri a écrit :
> Petite démo, à toutes fins utiles (c'est du bash>=2.05b)
>
> $ eval $(
>      env LANG=fr_CH date +"$(
> 	date --help |
> 	    sed -ne '/^  %[^ %]\{1,4\} .*$/{
> 		s/^  %\([^ ]*\) .*$/\1/;
> 		y|:|_|;
> 		p;
> 		y|_|:|;
> 		p}' |
> 	xargs printf "DATE_%s=\"%%%s\" "
> 	)"
>      )

Il y a ça sinon, mais bon ça n'utilise pas du tout eval (ce qui sort un 
peu du sujet... mais j'avais fait ça en cherchant à comprendre pourquoi 
'date --help' avait été utilisé...). (en bash 4.1)


Dans un fichier nommé 'testdate', à sourcer dans le .bashrc par exemple:

$ function my { date +"$(echo $@ | sed 's/DATE_\(.\)/%\1/g')" | sed -e 
's/[%|DATE_]//g;s/\.\ /\./g'; }

$ . testdate
$ my DATE_{X,x,,c,E}
18:00:41 06.11.11  dim 06 nov 2011 18:00:41 C


Et si ça peut servir à quelqu'un, en 1 ligne par déclaration de date, et 
en 1 ligne tout court (c'est pas très léger et ça peut être amélioré je 
sais ^^):

$ function my { if [ "$1" == "l" ]; then for list in $@; do date 
+"$(echo $list | sed 's/DATE_\(.\)/%\1/g')" | sed -e 
's/[%|DATE_]//g;s/\.\ /\./g;/^l$/d'; done; else date +"$(echo $@ | sed 
's/DATE_\(.\)/%\1/g')" | sed -e 's/[%|DATE_]//g;s/\.\ /\./g'; fi; }


$ . testdate
$ my l DATE_{X,x,,c,E}
18:00:42
06.11.11

dim 06 nov 2011 18:00:42 C


J'avais un peu utilisé eval pour utiliser des noms de variables 
dynamiques, mais ça m'avait posé quelques soucis en bash ...

En tout cas, merci pour cette astuce avec eval :)


More information about the gull mailing list