${!FOO}
esegue una doppia sostituzione in bash
, nel senso che prende il valore (stringa) di FOO e lo usa come nome di variabile.
zsh
non supporta questa funzione.
C'è un modo per rendere questo lavoro uguale in bash
e zsh
?
Sfondo:
Ho un elenco di variabili d'ambiente, come
PATH MAIL EDITOR
e voglio prima stampare i nomi delle variabili e successivamente i loro valori.
Questo funziona bash
ma non zsh
:
for VAR in LIST
do
echo $VAR
echo ${!VAR}
done
Dovrebbe essere in qualche modo possibile "alla vecchia maniera" eval
, ma non riesco a farlo funzionare:
for VAR in LIST
do
echo $VAR
echo `eval \$$VAR`
done
Non capirò mai perché non posso semplicemente fare sostituzioni profonde arbitrarie come ${${VAR}}
o anche ${${${VAR}}}
se necessario, quindi anche una spiegazione sarebbe buona.
bash
, ha infatti la stessa funzione (e molto di più), utilizza solo uno schema diverso, vale a dire ${(p)FOO}
.
(e)
flag di espansione dei parametri di zsh è stato aggiunto in zsh-2.6-beta17 (maggio 1996), il (P)
flag in 3.1.5-pws-7 (1999). bash's ${!var}
in 2.0 (dicembre 1996).