変数拡張を延期する方法

変数拡張を延期する方法

次のようにまだ設定されていない変数を使用して、スクリプトの上部にある文字列を初期化したいと思います。

str1='I went to ${PLACE} and saw ${EVENT}'
str2='If you do ${ACTION} you will ${RESULT}'

その後、後で、、、およびPLACE設定されます。その後、拡張変数を使用して文字列を印刷できるようにしたいです。それは私の唯一の選択ですか?これはうまくいくようです:EVENTACTIONRESULTeval

eval "echo ${str1}"

これは標準ですか?もっと良い方法がありますか?eval変数が何でもよいことを考慮すると、実行しないことが最善です。

ベストアンサー1

表示される入力タイプの場合、シェル拡張を利用して値を文字列に置き換える唯一の方法はeval。これは、値を制御し、str1安全であることが知られている変数のみを参照し(機密データは含まず)、引用符がない他のシェル特殊文字を含まない限り安全です。文字列を二重引用符で囲むか、ここで拡張する必要があります"$\`\str1

eval "substituted=\"$str1\""

文字列の代わりに関数を定義する方が強力です。

fill_template () {
  sentence1="I went to ${PLACE} and saw ${EVENT}"
  sentence2="If you do ${ACTION} you will ${RESULT}"
}

変数を設定し、関数を呼び出してfill_template出力変数を設定します。

PLACE=Sydney; EVENT=fireworks
ACTION='not learn from history'; RESULT='have to relive history'
fill_template
echo "During my holidays, $sentence1."
echo "Cicero said: \"$sentence2\"."

おすすめ記事