如何使用 eval 将包含空格的值分配给 bash 中的变量

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)

  • 使用 `eval` _that way_ 是错误的。你在将它传递给 `eval` 之前扩展 `$var_value`,这意味着它将被解释为 shell 代码!(例如尝试使用 `var_value="';:(){ :|:&amp;};:'"`) (2认同)