今回も既出の情報シリーズをお送りいたします
やりたいこと
例えば ${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」コマンドは、指定した文字列を評価後に連結して、現在のシェルに実行させます。主にシェルスクリプトや環境設定用のファイルで使用します
$ hoge=hoge $ fuga=fuga $ hoge_fuga=hogefuga $ eval "echo \${hoge_${fuga}}" hogefuga
最初の式の展開では評価してほしくない ${hoge_${fuga}}
を \
でエスケープしています。なので ${fuga}
だけが最初に評価され、その後に echo ${hoge_fuga}
が評価されるので構文エラーになりません。もちろん $()
も使えます。
便利ですね!