3 回答

TA貢獻(xiàn)1818條經(jīng)驗(yàn) 獲得超7個(gè)贊
避免使用可能帶來的安全隱患的一種更好的方法eval是
declare "$var=$val"
請(qǐng)注意,這declare是typesetin 的同義詞bash。該typeset命令得到更廣泛的支持(ksh并且zsh也可以使用它):
typeset "$var=$val"
在的現(xiàn)代版本中bash,應(yīng)使用nameref。
declare -n var=x
x=$val
它比更加安全eval,但仍然不夠完美。

TA貢獻(xiàn)1854條經(jīng)驗(yàn) 獲得超8個(gè)贊
Bash有一個(gè)擴(kuò)展printf,可以將其結(jié)果保存到變量中:
printf -v "${VARNAME}" '%s' "${VALUE}"
這樣可以防止所有可能的轉(zhuǎn)義問題。
如果您對(duì)使用無效的標(biāo)識(shí)符$VARNAME,該命令將失敗并返回狀態(tài)代碼2:
$ printf -v ';;;' foobar; echo $?
bash: printf: `;;;': not a valid identifier
2

TA貢獻(xiàn)1825條經(jīng)驗(yàn) 獲得超6個(gè)贊
eval "$var=\$val"
的參數(shù)eval應(yīng)始終是用單引號(hào)或雙引號(hào)引起來的單個(gè)字符串。在極端情況下,所有偏離此模式的代碼都具有某些意外行為,例如帶有特殊字符的文件名。
當(dāng)evalshell擴(kuò)展參數(shù)to時(shí),將$var其替換為變量名,并將其\$替換為一個(gè)簡單的美元。因此,評(píng)估的字符串變?yōu)椋?/p>
varname=$value
這正是您想要的。
通常,所有形式的表達(dá)式都$varname應(yīng)該用雙引號(hào)引起來。只有兩個(gè)地方可以省略引號(hào):變量賦值和case。由于這是變量分配,因此此處不需要引號(hào)。不過,它們不會(huì)受到傷害,因此您也可以將原始代碼編寫為:
eval "$var=\"the value is $val\""
添加回答
舉報(bào)