Re: [#!/fr] Indirect expansion (was: Re: Bug declare array b…

Page principale
Supprimer ce message
Répondre à ce message
Auteur: Daniel Varlet
Date:  
À: La liste francophone des scripts shell
Sujet: Re: [#!/fr] Indirect expansion (was: Re: Bug declare array bash???)
À 23:14 +0200 le 30.6.2007, Patrick Proniewski écrivait au sujet de "Re: [#!/fr] Indirect expansion (was: Re: Bug declare array " :
>Content-Type: multipart/signed; micalg=sha1; boundary=Apple-Mail-2-919926195;
>    protocol="application/pkcs7-signature"
>
>On 30 juin 07, at 20:30, Daniel Varlet wrote:
>
>>    # 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
>
>
>nop nop nop, je pense que tu as mal compris le man bash,


Pas le man de bash 3zz (je ne l'ai pas), mais Advanced Bash-Scripting Guide, et effectivement j'ai lu trop vite en prenant mes désirs pour des réalités. Donc ça retourne les indices des éléments d'un array, et il n'est pas question de référence indirecte.

>car en fait, ${!a[@]} n'est pas considéré une référence indirecte :


Ça fait deux fois que tu écris ça.
${!a[@]} ne peut en aucun cas être considéré comme référence indirecte.
Pas plus que {!a}.
Ce sont des "façons" de récupérer des "trucs"... La nomenclature exacte est indirect variable expansion pour la dernière. Et la première, un truc comme keys expansion.
On pourrait décrire $a comme une référence indirecte à $ref. $a contient simplement le nom d'une variable.

Note que bash (2.05b.0(1)) considère toujours une variable "simple" comme un array (assignement à l'indice 0 par défaut). Ce qui explique entre autre la nécessité du unset pour virer TOUS les indices/valeurs et éviter les mauvaises surprises si elle a déjà été assignée. Mais passons...

>
> ${!name[@]}
> ${!name[*]}
> If name is an array variable, expands to the list  
>of array
> indices (keys) assigned in name. If name is not an array,
> expands to 0 if name is set and null otherwise. When @ is used
> and the expansion appears within double quotes, each key expands
> to a separate word.
>
>si tu as une table, alors le résultat de ${!table[@]}, est la liste des clés du tableau (0, 1, 2, 3, ...). Dans ton exemple, $a n'est pas une table mais tu utilises la syntaxe d'une table (a[@]), donc cela retourne 0, comme indiqué dans le man.


Voir plus haut, ce que je pense de table ou pas table. M'étonnerait que ça ait beaucoup changé en 3.zzz, le retour de 0 si "name is not an array" (sic) me semble presque un aveu. C'est du bricolage emberlificotant de l'auteur de bash. Ça lui permettra sans doute dans 10'000 ans d'implémenter un autre type d'array sans trop casser ses définitions existantes.

Ceci semble donc être la définition du binz (non testé évidemment):

$ unset a; a=("a0" "a1" "a2 a3"); for z in "${!a[@]}"; do echo "${a[z]}"; done
a0
a1
a2 a3

A+


-- 
Daniel


_______________________________________________
archives : 
http://listes.patpro.net/list/sshfr.fr.html
http://listes.patpro.net/mailman/listinfo/script_shell_fr