web-dev-qa-db-ja.com

bashでの感嘆符による変数置換

.cfg bashスクリプトファイルに次の行があります

DDF_SOURCE="siebel_DATA_DATE_FORMAT"
DATA_DATE_FORMAT=${!DDF_SOURCE}

${!DDF_SOURCE}評価しましたか?それはそのようになります !siebel_DATA_DATE_FORMAT、これは私には意味がありません。

49
van

それは間接展開であり、man bashセクション[〜#〜] expansion [〜#〜]、サブセクションParameter Expansion

パラメータの最初の文字が感嘆符(!)の場合、変数の間接参照のレベルが導入されます。 Bashは、残りのパラメーターから形成された変数の値を変数の名前として使用します。次に、この変数が展開され、その値がパラメーター自体の値ではなく、残りの置換で使用されます。これは間接展開と呼ばれます。

bash-4.2$ DDF_SOURCE="siebel_DATA_DATE_FORMAT"

bash-4.2$ siebel_DATA_DATE_FORMAT='Hello Indirect Redirection'

bash-4.2$ DATA_DATE_FORMAT=${!DDF_SOURCE} # siebel_DATA_DATE_FORMAT must get value before this line

bash-4.2$ echo $DATA_DATE_FORMAT
Hello Indirect Redirection
71
manatwork