${!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.
zshne 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 bashet 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 bashmais 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).