${!FOO}executa uma substituição dupla em bash, o que significa que pega o valor (string) de FOO e o usa como um nome de variável.
zshnão suporta esse recurso.
Existe uma maneira de fazer isso funcionar da mesma maneira bashe zsh?
Fundo:
Eu tenho uma lista de variáveis de ambiente, como
PATH MAIL EDITOR
e deseja primeiro imprimir os nomes das variáveis e depois seus valores.
Isso funciona, bashmas não zsh:
for VAR in LIST
do
echo $VAR
echo ${!VAR}
done
Deveria ser de alguma forma possível "do jeito antigo" eval, mas não consigo fazer isso funcionar:
for VAR in LIST
do
echo $VAR
echo `eval \$$VAR`
done
Eu nunca vou entender por que não posso simplesmente fazer substituições profundas arbitrárias como ${${VAR}}ou mesmo ${${${VAR}}}se necessário, então uma explicação para isso também seria legal.
bash, ele realmente tem a mesma função (e muito mais), apenas usa um padrão diferente, a saber ${(p)FOO}.
(e)sinalizador de expansão de parâmetro do zsh foi adicionado no zsh-2.6-beta17 (maio de 1996), o (P)sinalizador em 3.1.5-pws-7 (1999). bash's ${!var}em 2.0 (dezembro de 1996).