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

Page principale
Supprimer ce message
Répondre à ce message
Auteur: Daniel Varlet
Date:  
À: La liste francophone des scripts shell
Anciens-sujets: Re: [#!/fr] Bug declare array bash???
Sujet: [#!/fr] Indirect expansion (was: Re: Bug declare array bash???)
À 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