Bash

如何推遲變數擴展

  • October 21, 2020

我想用尚未設置的變數初始化腳本頂部的一些字元串,例如:

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\"."

引用自:https://unix.stackexchange.com/questions/60688