出于好奇:
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
为什么?
最佳答案
非常简短的回答
阅读BashFAQ #50 .
稍微简短的回答
变量扩展不会经过所有解析步骤(实际上,如果经过,则不可能编写安全地处理 bash 中不可信数据的脚本)。未加引号的扩展仅通过字符串拆分和 glob 扩展——这些阶段将字符串拆分成多个部分,并将这些部分评估为 glob,但不将这些部分中的任何部分识别为语法。引用的扩展按字面替换,这意味着它们保留字符串、句号。
因此:
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
)。
关于linux - shell脚本中 "&&"内部变量和外部变量的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44339861/