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