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)
为什么?
阅读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
).