是否有必要在bash中的变量赋值期间引用命令替换?

时间:2014-11-24 09:10:05

标签: bash shell sh

几乎在我读过的所有地方,包括谷歌的bash脚本风格指南都提到引用命令替换的必要性(当然除非特别需要)。

我理解在一般使用期间引用命令替换的时间/地点/原因。例如:echo "$(cat <<< "* useless string *")"而不是echo $(...)

然而,对于具体的变量赋值,我看到了很多这样的例子: variable="$(command)"

然而,我没有发现variable=$(command)不等同的实例。

variable="$(echo "*")"variable=$(echo "*")都将值设置为&#39; *&#39;。

任何人都可以给出在变量分配期间不加引号的替换会导致问题吗?

3 个答案:

答案 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)

使用这么多不同的命令进行测试,它是一样的。无法找到差异。