linux - shell脚本中 "&&"内部变量和外部变量的区别

标签 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

为什么?

最佳答案

非常简短的回答

阅读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/

相关文章:

java - java代码有问题,必须在linux终端上执行

使用外部库引用编译 C 代码

linux - 为什么接收UDP消息时需要bind?

linux - 获取自上次修改文件以来的天数

java - 在 Java 中处理 SIGCHLD 信号

string - 复制文件夹名称中的空格时将文件夹名称附加到文件名

linux - 更改 dot.profile 和 .bashrc

c - 你如何使用非选项参数的 getopt()

linux - SLURM - 回显输出文件以便在屏幕上打印?

bash - 为什么 echo -n 在 Mac 上的 shell 中不起作用?