出于好奇:
A="echo hi"
B="echo hello"
C="$A && $B"
echo $C // prints "echo hi && echo hello"
$C
echo "$A && $B" // prints "echo hi && echo hello"
$A && $B
我虽然这会以同样的方式运作。但它显示了不同的结果:
echo hi && echo hello
hi && echo hello
echo hi && echo hello
hi
hello
为什么?
答案 0 :(得分:6)
阅读BashFAQ #50。
变量扩展不会经历所有解析步骤(实际上,如果他们这样做,就不可能编写脚本来安全地处理bash中的不受信任的数据)。不带引号的扩展只通过字符串拆分和glob扩展 - 这些阶段将字符串拆分成片段,并将这些片段评估为globs,但不将这些片段中的任何一个识别为语法。引用的扩展在字面上被替换,意味着它们保持字符串,句号。
因此:
echo $C # runs: "echo" "echo " "hi" "&&" "echo" "hello"
$C # runs: "echo " "hi" "&&" "echo" "hello"
echo "$A && $B" # runs: "echo" "echo hi && echo hello"
$A && $B # runs: "echo" "hi" && "echo" "hello"
请注意,在上一个示例中,&&
是如何引用的?这表示它被解析为语法,而不是数据。作为语法,&&
充当命令分隔符(而作为数据,它只是传递给echo
)。