${!FOO}
führt eine doppelte Substitution in bash
durch , was bedeutet, dass es den (String-)Wert von FOO nimmt und als Variablennamen verwendet.zsh
unterstützt diese Funktion nicht.
Gibt es eine Möglichkeit, dass dies in bash
genauso funktioniert und zsh
?
Hintergrund:
Ich habe eine Liste mit Umgebungsvariablen wie
PATH MAIL EDITOR
und zuerst die Variablennamen und danach deren Werte ausdrucken wollen.
Dies funktioniert in bash
aber nicht zsh
:
for VAR in LIST
do
echo $VAR
echo ${!VAR}
done
Es sollte irgendwie „auf die alte Art“ mit eval
möglich sein , aber ich kann es nicht zum Laufen bringen:
for VAR in LIST
do
echo $VAR
echo `eval $$VAR`
done
Ich werde nie verstehen, warum ich nicht einfach beliebige tiefe Ersetzungen wie ${${VAR}}
vornehmen kann oder sogar ${${${VAR}}}
notfalls wäre eine Erklärung dafür auch nett.
Akzeptierte Antwort:
Sowohl bash als auch zsh haben eine Möglichkeit, eine indirekte Erweiterung durchzuführen, aber sie verwenden eine andere Syntax.
Es ist einfach genug, eine indirekte Erweiterung mit eval
durchzuführen; dies funktioniert in allen POSIX- und den meisten Bourne-Shells. Achten Sie darauf, richtig zu zitieren, falls der Wert Zeichen enthält, die in der Shell eine besondere Bedeutung haben.
eval "value="${$VAR}""
echo "$VAR"
echo "$value"
${${VAR}}
funktioniert nicht, weil es kein Feature ist, das irgendeine Shell implementiert. Das Ding innerhalb der geschweiften Klammern muss den Syntaxregeln entsprechen, die ${VAR}
nicht enthalten . (In zsh ist dies eine unterstützte Syntax, macht aber etwas anderes:verschachtelte Ersetzungen führen aufeinanderfolgende Transformationen für denselben Wert durch; ${${VAR}}
entspricht $VAR
da dies die Identitätstransformation zweimal für den Wert durchführt.)