Supposez que la valeur d'une variable soit le nom d'une seconde variable. Est-il possible de retrouver la valeur de cette deuxième variable à partir de la première? Par exemple, si a=lettre_de_l_alphabet et lettre_de_l_alphabet=z, est-ce qu'une référence à a pourrait renvoyer z? En fait, c'est possible et cela s'appelle une référence indirecte. On utilise la notation inhabituelle eval var1=\$$var2.
Exemple 9-21. Références indirectes
#!/bin/bash # Référencement de variable indirecte. a=lettre_de_l_alphabet lettre_de_l_alphabet=z echo # Référence directe. echo "a = $a" # Référence indirecte. eval a=\$$a echo "Maintenant a = $a" echo # Maintenant, essayons de changer la référence du deuxième. t=tableau_cellule_3 tableau_cellule_3=24 echo "\"tableau_cellule_3\" = $tableau_cellule_3" echo -n "Déréférencé \"t\" = "; eval echo \$$t # Dans ce cas simple, # eval t=\$$t; echo "\"t\" = $t" # fonctionne aussi (pourquoi?). echo t=tableau_cellule_3 NOUVELLE_VALEUR=387 tableau_cellule_3=$NOUVELLE_VALEUR echo "Modification de la valeur de \"tableau_cellule_3\" en $NOUVELLE_VALEUR." echo "\"tableau_cellule_3\" vaut maintenant $tableau_cellule_3" echo -n "Déréférencé \"t\" maintenant "; eval echo \$$t # "eval" prend deux arguments "echo" et "\$$t" (set equal to $tableau_cellule_3) echo # (Merci, S.C., pour la clarification sur le comportement ci-dessus.) # Une autre méthode est la notation ${!t} notation, discutée dans "Bash, #+ version 2" section. # Voir aussi l'exemple "ex78.sh". exit 0 |
Exemple 9-22. Passer une référence indirecte à awk
#!/bin/bash # Une autre version du script "column totaler" # qui ajoute une colonne spécifiée (de nombres) dans le fichier cible. # Ceci utilise les références indirectes. ARGS=2 E_MAUVAISARGS=65 if [ $# -ne "$ARGS" ] # Vérifie le bon nombre d'arguments sur la ligne de # commande. then echo "Usage: `basename $0` nomfichier numéro_colonne" exit $E_MAUVAISARGS fi nomfichier=$1 numero_colonne=$2 #===== Identique au script original, jusqu'à ce point =====# # Un script multi-ligne est appelé par awk ' ..... ' # Début du script awk. # ------------------------------------------------ awk " { total += \$${numero_colonne} # indirect reference } END { print total } " "$nomfichier" # ------------------------------------------------ # Fin du script awk. # La référence de variable indirecte évite les problèmes de # référence d'une variable shell à l'intérieur d'un script embarqué. # Merci, Stephane Chazelas. exit 0 |
![]() | Cette méthode de référence indirecte est un peu délicate. Si la variable de second ordre change de valeur, alors la variable de premier ordre doit être correctement déréférencée (comme sur l'exemple ci-dessous). Heureusement, la notation ${!variable} introduite avec la version 2 de Bash (voir Exemple 35-2) rend les références indirectes plus intuitives. |
Précédent | Sommaire | Suivant |
Typer des variables: declare ou typeset | Niveau supérieur | $RANDOM: générer un nombre aléatoire |