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

为什么 bash 变量扩展保留引号?
> echo "hi"
hi
> VAR='echo "hi"'
> $VAR
"hi"

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

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

> VAR="echo 'hi'"
> $VAR
> 'hi'

答案1

额外的一对引号只会被额外的评估步骤消耗。例如强制eval

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

bash-4.2$ $VAR
"hi"

bash-4.2$ eval $VAR
hi

但通常将带参数的命令放在一个字符串中并不是一个好主意。使用数组代替:

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

bash-4.2$ "${VAR[@]}"
hi

答案2

报价删除只出现在原始输入单词上,不是关于扩展的结果。作为扩展变量一部分的引号保持不变。

答案3

如果您退后一步,您就会明白为什么变量替换绝对应该保留引号。

Unix/Linux/BSD shell 中引号的作用是将字符串的各个部分保持在一起,否则这些字符串将被解析为多个字符串。由于默认情况下 shell 使用空格作为标记分隔符,因此带有空格的字符串(如“一二三”)如果不加引号或以某种方式转义,将被解析为 3 个字符串:“一”、“二”和“三”。

如果程序员想要一个字符串,其中插入了某个变量的值:

VAR=two
STRING="one $VAR three"

shell 绝对不应该删除引号:包含空格的字符串将被解析为 3 个较小的字符串。

相关内容