变量和命令替换的双引号
变量替换只应在双引号内使用。
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
在双引号之外,$var
取 var
的值,将其拆分为以空格分隔的部分,并将每个部分解释为 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")"