${!FOO}
bash
で二重置換を実行します 、つまり、FOOの(文字列)値を取得し、それを変数名として使用します。
zsh
この機能はサポートされていません。
これをbash
で同じように機能させる方法はありますか? およびzsh
?
背景:
のような環境変数のリストがあります
PATH MAIL EDITOR
最初に変数名を出力し、その後にそれらの値を出力したい。
これはbash
で機能します ただし、zsh
ではありません :
for VAR in LIST
do
echo $VAR
echo ${!VAR}
done
eval
で「古い方法」がどういうわけか可能になるはずです 、しかし私はそれを機能させることができません:
for VAR in LIST
do
echo $VAR
echo `eval $$VAR`
done
${${VAR}}
のような任意の深い置換を単純に実行できない理由を理解することはできません。 または${${${VAR}}}
必要に応じて、その説明もいいでしょう。
承認された回答:
bashとzshはどちらも間接拡張を実行する方法がありますが、使用する構文は異なります。
eval
を使用して間接拡張を実行するのは簡単です;これは、すべてのPOSIXおよびほとんどのBourneシェルで機能します。値にシェルで特別な意味を持つ文字が含まれている場合は、適切に引用するように注意してください。
eval "value="${$VAR}""
echo "$VAR"
echo "$value"
${${VAR}}
シェルが実装する機能ではないため、機能しません。中括弧内のものは、${VAR}
を含まない構文規則に準拠している必要があります 。 (zshでは、これはサポートされている構文ですが、何か違うことをします。ネストされた置換は、同じ値に対して連続した変換を実行します; ${${VAR}}
$VAR
と同等です これは、値に対して2回恒等変換を実行するためです。)