为什么 bash 变量扩展保留引号?

Cor*_*ein 13 shell bash quoting

> echo "hi"
hi
> VAR='echo "hi"'
> $VAR
"hi"
Run Code Online (Sandbox Code Playgroud)

为什么上述命令的输出不同?

单引号也会发生类似的事情:

> VAR="echo 'hi'"
> $VAR
> 'hi'
Run Code Online (Sandbox Code Playgroud)

man*_*ork 17

额外的报价对只会被额外的评估步骤消耗。例如被强制eval:

bash-4.2$ VAR='echo "hi"'

bash-4.2$ $VAR
"hi"

bash-4.2$ eval $VAR
hi
Run Code Online (Sandbox Code Playgroud)

但通常将带有参数的命令放在一个字符串中是一个坏主意。改用数组:

bash-4.2$ VAR=(echo "hi")

bash-4.2$ "${VAR[@]}"
hi
Run Code Online (Sandbox Code Playgroud)


jw0*_*013 10

引用删除仅发生在原始输入词上,而不发生在扩展结果上。作为扩展变量的一部分的引号未受影响。