在bash中的变量赋值过程中是否需要引用命令替换?

在bash中的变量赋值过程中是否需要引用命令替换?,bash,shell,sh,Bash,Shell,Sh,几乎我读过的所有地方,包括Google的bash脚本风格指南都提到引用命令替换的必要性(当然,特别需要时除外) 我理解在一般使用过程中引用命令替换的时间/地点/原因。例如:echo“$(catshell不执行变量赋值的分词(POSIX以这种方式对其进行标准化,您可以依赖它)。因此,在 但是,分词是在执行命令之前执行的,因此在 echo $(command) echo "$(command)" 结果可能会有所不同。后者保留所有多空格序列,而前者使每个单词都有不同的参数进行回显。由您决定哪一个是所

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


我理解在一般使用过程中引用命令替换的时间/地点/原因。例如:
echo“$(catshell不执行变量赋值的分词(POSIX以这种方式对其进行标准化,您可以依赖它)。因此,在

但是,分词是在执行命令之前执行的,因此在

echo $(command)
echo "$(command)"
结果可能会有所不同。后者保留所有多空格序列,而前者使每个单词都有不同的参数进行回显。由您决定哪一个是所需的行为

有趣的shell怪癖:还有一个地方引用替换与否没有区别,即
构造中的
case expr中的表达式

case $FOO in
  (frob) ...;;
esac

case "$FOO" in
  (frob) ...;;
esac

使用这么多不同的命令进行测试,结果是一样的。找不到区别。

使用BASH时,这两行是100%等效的:

variable="$(command)"
variable=$(command)
而这两个不是:

echo $(command)
echo "$(command)"
唉,人脑不是电脑,尤其是重复工作时,它就不那么可靠了

所以,如果您混合使用样式(即,在使用命令参数时引用,但在指定变量时不引用),偶尔会出错

更糟糕的是,有时你会希望命令结果被扩展成单个单词,而下一个读你代码的人会怀疑他是否在看一个bug


结论:由于前两行是相同的,所以在一般大脑中,总是引用
$()
(即使没有必要)以确保在必要时总是引用。

问得好!我做了很多测试,看起来它们完全一样,没有区别。我想他问的问题可能会发生在$cmd上${cmd}。在替换和If子句中,我们需要“”在那里。如果我错了,请更正,这是这个答案所说的。你能给一个链接到POSIX标准中需要它的确切部分吗?我很难找到它。@Lucas我将解释2.9.1简单命令,#4 In::在赋值之前,应展开每个变量赋值,以进行波浪线展开、参数展开、命令替换、算术展开和引号删除。"这里没有说分词。在
bash
中,用作here string操作符参数的参数扩展也不受分词或路径名生成的影响,尽管直到最近的4.4版本,bug修复才使其成为现实。好吧,这就解释了为什么在我发布时建议如此频繁地使用它st开始编写shell脚本,我把引用作为一般规则。现在我对它更熟悉了,我只是尝试消除任何多余或不必要的东西。这不是问题的答案。要想看到区别,请尝试
echo$(echo-e“hello\nworld”)
echo“$(echo-e“hello\nworld”)”
echo $(command)
echo "$(command)"