Tout d'abord, vous n'avez pas besoin d'utiliser $(echo $FRUITS)
dans la for
déclaration. Utiliser juste $FRUITS
suffit. Ensuite, vous pouvez supprimer l'une des lignes à l'intérieur de la boucle, en utilisant eval
.
Le eval
dit simplement à bash de faire une deuxième évaluation de la déclaration suivante (c'est-à-dire une de plus que son évaluation normale). Le \$
survit à la première évaluation en tant que $
, et la prochaine évaluation traite ensuite cela $
comme le début d'un nom de variable, qui se résout en "Jaune", etc.
De cette façon, vous n'avez pas besoin d'avoir une étape distincte qui crée une chaîne intermédiaire (ce qui est, je crois, l'objectif principal de votre question).
for fruit in $FRUITS ;do
eval echo $fruit is \$${fruit}_COLOUR
done
Pour une méthode alternative, comme mentionné par Patrick dans un commentaire (ci-dessus), vous pouvez utiliser à la place un tableau associatif , dans lequel l'index d'un élément n'a pas besoin d'être un entier. Vous pouvez utiliser une chaîne, comme le nom d'un type de fruit. Voici un exemple, en utilisant le tableau associatif de bash:
# This declares an associative array (It unsets it if it already exists)
declare -A colour
colour['BANANA']="Yellow"
colour["APPLE"]="Green or Red"
colour[MARTIAN ORANGE]="Blue"
for fruit in BANANA APPLE "MARTIAN ORANGE" ;do
echo "$fruit" is "${colour[$fruit]}"
done
!
syntaxe est un indicateur sur la substitution de variable qui dit essentiellement «remplacer deux fois». Cela ne change pas l'exigence que ce qui est à l'intérieur du${…}
doit être un nom de variable. Donc non, vous ne pouvez pas éviter d'utiliser une variable qui contient le nom, sauf si vous utilisez une méthode différente (eval
).