1時間ぐらい悩んだのでメモ。
A=${B}, B=${C}, …#
以下のように変数が入れ子になっている状態を考える。
A='${B}'
B=334
変数 A だけが既知のとき、変数 A の指す先の変数 B に入っている値を読み出したい。この場合、eval を用いることですっきり書ける。
eval echo ${A}
# => echo ${B}
# => 334
echo ${A} は echo \${B} と解釈されるので、そのまま eval に渡せば ${B} の指し先が分かるという仕組みだ。
同様に、変数が 3 つ以上連なっている場合も eval を連打することで展開することができる。
A='${B}'
B='${C}'
C=334
eval eval echo ${A}
# => 334
A=B, B=C, …#
少し似たようなケースで、以下のように変数が入れ子になっている場合を考える。
A=B
B=C
C=334
この場合、前節と同様に eval することで値を取り出せる。
eval eval echo \\\$\$${A}
# => eval echo \$$B
# => echo $C
# => 334
なお、変数のネストが1段階だけの場合、Indirect Expansionという機能を用いて次のように書くこともできる。
echo ${!B}
# => echo ${C}
# => echo 334
