“&&”之间的区别shell脚本中的内部变量和外部变量

时间:2017-06-03 03:11:58

标签: linux bash unix 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

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

echo hi && echo hello
hi && echo hello
echo hi && echo hello
hi
hello

为什么?

1 个答案:

答案 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)。