几乎在我读过的所有地方,包括谷歌的bash脚本风格指南都提到引用命令替换的必要性(当然除非特别需要)。
我理解在一般使用期间引用命令替换的时间/地点/原因。例如:echo "$(cat <<< "* useless string *")"
而不是echo $(...)
然而,对于具体的变量赋值,我看到了很多这样的例子:
variable="$(command)"
然而,我没有发现variable=$(command)
不等同的实例。
variable="$(echo "*")"
和variable=$(echo "*")
都将值设置为&#39; *&#39;。
任何人都可以给出在变量分配期间不加引号的替换会导致问题吗?
答案 0 :(得分:6)
shell不对变量赋值执行分词(它由POSIX标准化,您可以依赖它)。因此,您不需要双引号(但您可以在
中使用它们而不会使结果不同)variable=$(command) # same as variable="$(command)"
但是,在执行命令之前执行分词,所以在
中echo $(command)
echo "$(command)"
结果可能不同。后者保留所有多空间序列,而前者使每个单词成为回声的不同参数。由您决定哪种行为是合适的。
有趣的shell怪癖:还有一个引用替换的地方没有区别,即case expr in
构造中的表达式。
case $FOO in
(frob) ...;;
esac
与
无法区分case "$FOO" in
(frob) ...;;
esac
答案 1 :(得分:4)
使用BASH时,这两行是100%等效的:
variable="$(command)"
variable=$(command)
虽然这两个不是:
echo $(command)
echo "$(command)"
唉,人脑不是一台电脑。在重复工作时,它尤其不可靠。
所以,如果你混合样式(即你在使用命令参数时引用但在分配变量时不引用),那么很可能会偶尔出现错误。
更糟糕的是,偶尔您会希望将命令结果扩展为单个单词。下一个阅读你代码的人会怀疑他是否正在查看错误。
结论:由于前两行是相同的,所以平均大脑更容易引用$()
(即使没有必要),以确保你总是引用你必须。
答案 2 :(得分:-2)
使用这么多不同的命令进行测试,它是一样的。无法找到差异。