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

我了解一般使用期间何时/何地/为什么引用命令替换。例如:echo "$(cat <<< "* useless string *")"而不是echo $(...)
但是,对于具体的变量分配,我已经看到了很多这样的示例:variable="$(command)"
但是我没有发现variable=$(command)不等效的情况。
variable="$(echo "*")"variable=$(echo "*")都将值设置为“*”。

任何人都可以给出在变量赋值期间不加引号实际上会引起问题的任何情况吗?

最佳答案

该 shell 程序不对变量赋值执行单词拆分(POSIX对此进行了标准化,因此您可以依靠它)。因此,您不需要双引号(但可以在不使结果不同的情况下使用它们)

variable=$(command)   # same as variable="$(command)"

但是,在执行命令之前先执行单词拆分。
echo $(command)
echo "$(command)"

结果可能会有所不同。后者保留所有多空间序列,而前者使每个单词具有不同的 echo 参数。由您决定哪个是所需的行为。

有趣的shell怪癖:还有一个地方用引号引起或不引起取代没有区别,即case expr in构造中的表达式。
case $FOO in
  (frob) ...;;
esac

与...没有区别
case "$FOO" in
  (frob) ...;;
esac

关于bash - 在bash中进行变量分配时是否需要引用命令替换?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27101227/

10-13 07:47
查看更多