Bash
如何推遲變數擴展
我想用尚未設置的變數初始化腳本頂部的一些字元串,例如:
str1='I went to ${PLACE} and saw ${EVENT}' str2='If you do ${ACTION} you will ${RESULT}'
然後在
PLACE
,EVENT
,ACTION
, 和RESULT
將被設置。然後我希望能夠在擴展變數的情況下列印出我的字元串。是我唯一的選擇eval
嗎?這似乎有效:eval "echo ${str1}"
這是標準嗎?有一個更好的方法嗎?
eval
考慮到變數可能是任何東西,最好不要執行。
使用您顯示的輸入類型,利用 shell 擴展將值替換為字元串的唯一方法是以
eval
某種形式使用。只要您控制 的值str1
並且可以確保它僅引用被稱為安全的變數(不包含機密數據)並且不包含任何其他未引用的 shell 特殊字元,這是安全的。您應該在雙引號內或在此處的文件中擴展字元串,這種方式只是"$\``特殊的(它們需要以
`in開頭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\"."