${!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.
zsh
não suporta esse recurso.
Existe uma maneira de fazer isso funcionar da mesma maneira bash
e 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, bash
mas 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).