${!FOO}
effectue une double substitution dans bash
, ce qui signifie qu'il prend la valeur (chaîne) de FOO et l'utilise comme nom de variable.
zsh
ne prend pas en charge cette fonctionnalité.
Existe-t-il un moyen de faire en sorte que cela fonctionne de la même manière dans bash
et zsh
?
Contexte:
J'ai une liste de variables d'environnement, comme
PATH MAIL EDITOR
et souhaitez d'abord imprimer les noms des variables et ensuite leurs valeurs.
Cela fonctionne bash
mais pas zsh
:
for VAR in LIST
do
echo $VAR
echo ${!VAR}
done
Cela devrait être en quelque sorte possible «à l'ancienne» avec eval
, mais je ne peux pas le faire fonctionner:
for VAR in LIST
do
echo $VAR
echo `eval \$$VAR`
done
Je ne comprendrai jamais pourquoi je ne peux pas simplement faire des substitutions profondes arbitraires comme ${${VAR}}
ou même ${${${VAR}}}
si besoin est, donc une explication serait bien aussi.
bash
, il a en effet la même fonction (et bien plus), n'utilise qu'un modèle différent, à savoir ${(p)FOO}
.
(e)
drapeau d'expansion des paramètres de zsh a été ajouté dans zsh-2.6-beta17 (mai 1996), le (P)
drapeau dans 3.1.5-pws-7 (1999). bash's ${!var}
en 2.0 (décembre 1996).