${!FOO}esegue una doppia sostituzione in bash, nel senso che prende il valore (stringa) di FOO e lo usa come nome di variabile.
zshnon supporta questa funzione.
C'è un modo per rendere questo lavoro uguale in bashe 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 bashma 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).