变量和命令替换的双引号

变量替换只应在双引号内使用。

calculation='2 * 3'
echo "$calculation"         # prints 2 * 3
echo $calculation           # prints 2, the list of files in the current directory, and 3
echo "$(($calculation))"    # prints 6

在双引号之外,$varvar 的值,将其拆分为以空格分隔的部分,并将每个部分解释为 glob(通配符)模式。除非你想要这种行为,否则总是将 $var 放在双引号内:$var

这同样适用于命令替换:$(mycommand)mycommand 的输出,$(mycommand) 是输出上 split + glob 的结果。

echo "$var"             # good
echo "$(mycommand)"     # good 
another=$var            # also works, assignment is implicitly double-quoted
make -D THING=$var      # BAD! This is not a bash assignment.
make -D THING="$var"    # good
make -D "THING=$var"    # also good

命令替换得到他们自己的引用上下文。编写任意嵌套替换很容易,因为解析器将跟踪嵌套深度,而不是贪婪地搜索第一个 " 字符。但是,StackOverflow 语法高亮显示器解析了这个错误。例如:

echo "formatted text: $(printf "a + b = %04d" "${c}")" # “formatted text: a + b = 0000”

命令替换的变量参数也应该在扩展中加双引号:

echo "$(mycommand "$arg1" "$arg2")"