2.6. Indirection

Bash offre la possibilité d’obtenir la valeur d’une variable v1 dont le nom est contenu (en tant que valeur "v1") dans une autre variable var. Il suffit pour cela d’utiliser la syntaxe de substitution suivante : ${!var}.

$ var=v1
$ v1=un
$ 
$ echo ${!var}
un
$

Ce mécanisme, appelé indirection, permet d’accéder de manière indirecte et par conséquent de façon plus souple, à la valeur d’un deuxième objet.

Le fichier shell indir illustre cette souplesse en montrant comment il est possible de créer « à la volée » le nom de la variable qui contient l’information souhaitée.

				#!/bin/bash
				#	@(#)	indir

				agePierre=10
				ageJean=20

				read -p "Quel age (Pierre ou Jean) voulez-vous connaitre ? "  prenom

				rep=age$prenom		# construction du nom de la variable
				echo ${!rep}

Deux variables agePierre et ageJean contiennent respectivement l’âge des personnes Pierre et Jean. Le programme demande à l’utilisateur de saisir le prénom dont il souhaite connaître l’âge, construit le nom de la variable contenant l’âge demandé puis affiche ce dernier.

$ indir
Quel age (Pierre ou Jean) voulez-vous connaitre ? Pierre
10
$ 
$ indir 
Quel age (Pierre ou Jean) voulez-vous connaitre ? Jean
20
$

Ce mécanisme s’applique également aux deux autres types de paramètres : les paramètres de position et les paramètres spéciaux.

$ a=un
$ b=deux
$ c=trois
$ 
$ set a b c		=>  $1, $2 et $3 ont respectivement pour valeur les chaînes
$			=>    "a", "b", "c"
$ echo $2
b
$
$ echo ${!2}	=> la valeur de $2 est la chaîne "b" qui est le nom d’une variable
deux		=>    contenant la valeur "deux"
$
$ echo ${!3}
trois
$
$ echo ${!#}	=> la valeur de $# est 3 et la valeur de $3 est la chaîne "c"
c
$

Remarque :

il ne faut pas confondre deux syntaxes très proches fournies par bash mais qui correspondent à deux mécanismes totalement différents : ${!param} et ${!var*}

La première syntaxe sera interprétée par le shell comme une indirection, tandis que la deuxième sera remplacée par les noms de variables qui commencent par var.

$ a=alpha
$ x=beta
$ age=20
$ 
$ echo ${!a*}	=> ${!a*} sera remplacée par les noms de 
a age 		=>    variables qui commencent par a
$