> 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 个较小的字符串。