变量内部的"&&"与shell脚本中的外部变量之间的区别

viz*_*viz 2 unix linux bash command-line sh

只是出于好奇:

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
Run Code Online (Sandbox Code Playgroud)

我虽然这会以同样的方式工作.但它显示了不同的结果:

echo hi && echo hello
hi && echo hello
echo hi && echo hello
hi
hello
Run Code Online (Sandbox Code Playgroud)

为什么?

Cha*_*ffy 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"
Run Code Online (Sandbox Code Playgroud)

注意在最后一个例子中,&&没有引用?这表示它被解析为语法,而不是数据.作为语法,&&充当命令分隔符(而作为数据,它只是传递给echo).