Séb*_*ent 22 shell bash quoting
我想使用eval. 以下虚拟示例有效:
var_name="fruit"
var_value="orange"
eval $(echo $var_name=$var_value)
echo $fruit
orange
Run Code Online (Sandbox Code Playgroud)
但是,当变量值包含空格时eval,即使$var_value放在双引号之间,也会返回错误:
var_name="fruit"
var_value="blue orange"
eval $(echo $var_name="$var_value")
bash: orange : command not found
Run Code Online (Sandbox Code Playgroud)
有什么办法可以绕过这个吗?
gle*_*man 15
不要使用 eval,使用 declare
$ declare "$var_name=$var_value"
$ echo "fruit: >$fruit<"
fruit: >blue orange<
Run Code Online (Sandbox Code Playgroud)
che*_*ner 12
不要eval用于此;使用declare.
var_name="fruit"
var_value="blue orange"
declare "$var_name=$var_value"
Run Code Online (Sandbox Code Playgroud)
请注意,分词不是问题,因为跟在 the 之后的所有内容=都被视为 by 的值declare,而不仅仅是第一个单词。
在bash4.3 中,命名引用使这更简单一些。
$ declare -n var_name=fruit
$ var_name="blue orange"
$ echo $fruit
blue orange
Run Code Online (Sandbox Code Playgroud)
你可以做eval的工作,但你仍然不应该:)使用eval是一个坏习惯进入。
$ eval "$(printf "%q=%q" "$var_name" "$var_value")"
Run Code Online (Sandbox Code Playgroud)