${!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.)