À 7:09 +0200 le 29.6.2007, Patrick Proniewski écrivait au sujet de "Re: [#!/fr] Bug declare array bash???" :
>Content-Type: multipart/signed; micalg=sha1; boundary=Apple-Mail-2-775598578;
> protocol="application/pkcs7-signature"
>
>On 28 juin 07, at 21:17, Daniel Varlet wrote:
>
>>Blague à part, c'est censé accélérer le toutim si j'ai pigé quelque chose. (cf. Advanced Bash-Scripting Guide). Mais aucune importance dans mes très rares utilisations d'arrays pour l'instant, et non testé. C'est déjà l'horreur horrible avec les arrays dans bash je ne vais pas y replonger. Sans compter les références indirectes: vivement le ${!a[@]} de la version 3.nn,.
>
>héhé, je ne connaissais pas, mais ${!a[@]} n'a pas l'air de se comporter comme une référence indirecte :
>
>$ table=("ti" "to" "tu" "la la")
>$ echo ${!table[@]}
>0 1 2 3
Mmmm, ça ne me semble pas clair (ce que j'ai écrit et ce que tu en as déduit).
Extrait de mes notes parce que je le v[ea]ux bie^h^h^h suis fainéant.
Je ne connais que 2 manières de récupérer le contenu d'une variable en ne disposant uniquement que de son nom (lui-même stocké dans une variable évidemment). Avec eval ou '!'.
<note>
# INDIRECT REFERENCES TO VARIABLES (BASH)
# VARIABLES "SIMPLES" (MONONEURONALES)
# Avec eval
$ a=ref
$ ref=z
$ echo $a
ref
$ eval a=\$$a
$ echo $a
z
# indirect expansion
# If the first character of parameter is an exclamation point, a level of variable indirection is introduced.
# The exception to this is the expansion of ${!prefix*} described below.
$ a=ref
$ ref=z
$ echo ${a}
ref
$ echo ${!a}
z
# ${!prefix*}
# Expands to the names of variables whose names begin with prefix, separated by the first character of the IFS special variable.
# VARIABLES ARRAYS
# C'est encore plus cryptico-prise-de-tête que d'habitude.
#Avec eval
#
# unset est "nécessaire" pour éviter les surprises (garde les vieux fonds d'array AMHA).
# Si ça ne fait pas de bien, ça ne fait pas de mal.
$ unset a ref; ref=("a0" "a1" "a2 a3"); a=ref; for z in "${a[@]}"; do echo "$z"; done
ref
$ eval a=( \"\${$a[@]}\" ); for z in "${a[@]}"; do echo "$z"; done # n'oublier aucun escape
a0
a1
a2 a3
# Avec '!', indirect expansion
#
# tentatives vouées à l'échec dans bash 2.05b.0(1)
$ unset a ref; ref=("a0" "a1" "a2 a3"); a=ref; for z in "${!a}"; do echo "$z"; done
a0
$ unset a ref; ref=("a0" "a1" "a2 a3"); a=ref; for z in "${!a[@]}"; do echo "$z"; done
# rien, que dalle
# Dans bash 3.zzzz
# ${!a[@]} devrait être implanté, ce qui éviterait de devenir fou avec les subtilités d'eval.
# résultat escompté donc:
$ unset a ref; ref=("a0" "a1" "a2 a3"); a=ref; for z in "${!a[@]}"; do echo "$z"; done
a0
a1
a2 a3
</note>
Ouf... Mince espoir que ce soit plus clair. ;-)
A+
--
Daniel
_______________________________________________
archives :
http://listes.patpro.net/list/sshfr.fr.html
http://listes.patpro.net/mailman/listinfo/script_shell_fr