ばーろぐわにる

SIerからWEB系?インフラエンジニアにジョブチェンジした見習いの備忘録。投稿内容は私個人の意見であり、所属企業・部門見解を代表するものではありません。

bashで変数の中で変数を使う

今回も既出の情報シリーズをお送りいたします

やりたいこと

例えば ${hoge_${fuga}} とか ${hoge_$(echo ${fuga})} みたいなことがやりたいと思ってもそのままやろうとすると怒られる。

$ echo ${hoge_${fuga}}
bash: ${hoge_${fuga}}: bad substitution
$ echo ${hoge_$(echo ${fuga})}
bash: ${hoge_$(echo ${fuga})}: bad substitution

なぜなら、変数展開時の記述方式を満たしていないので

Shell Parameter Expansion (Bash Reference Manual)

evalを使う

evalは式の展開を2段階に分けれます

「eval」コマンドは、指定した文字列を評価後に連結して、現在のシェルに実行させます。主にシェルスクリプトや環境設定用のファイルで使用します

www.atmarkit.co.jp

$ hoge=hoge
$ fuga=fuga
$ hoge_fuga=hogefuga
$ eval "echo \${hoge_${fuga}}"
hogefuga

最初の式の展開では評価してほしくない ${hoge_${fuga}}\エスケープしています。なので ${fuga} だけが最初に評価され、その後に echo ${hoge_fuga} が評価されるので構文エラーになりません。もちろん $() も使えます。

便利ですね!