‘&&’和’;’之间有区别吗? 标准BASH终端中的符号?

他们似乎都指示BASH开始跟随符号的另一个命令,但是有明显的区别吗?

有了这条线:

command1 && command2 

如果(并且仅当)command1返回退出状态零,则将执行command2,而在此行中:

 command1 ; command2 

无论如何都将执行command1和command2。 分号允许您在一行上键入许多命令。

你可以尝试自己的差异:

  1. ls /invalid/path && echo "hello!"
    由于/ invalid / path不存在,ls无法显示目录列表。 它将失败并显示错误消息:“ls:/ invalid / path:No such file or directory”。
    命令的后半部分 (echo“hello!”) 从未执行过,因为上半部分失败了。

  2. ls /invalid/path ; echo "hello!"
    出现与以前相同的错误消息,但这次, 第二部分被执行
    ls:/ invalid / path:没有这样的文件或目录
    你好!

为什么这有用?
假设您要提取名为archive.tar.gz的文件
您可以使用命令tar zxvf archive.tar.gz && rm archive.tar.gz
如果由于任何原因提取存档失败,则不执行第二部分! 你可以再试一次。

如果你使用; 在相同的情况下,存档将被删除,您不能再试一次。

&&AND ,意味着第二个命令只有在第一个命令返回true(无错误)时才会执行。

更新 :我已经添加了脚本来高亮一些可能的陷阱:

因为没有人提到“||”,我会的

Update2 :这里有一些重要的重写措辞
&&就像是“if”语句的“then”,它响应“true”

|| 不像“if”声明中的“其他”
|| 就像“if”语句的“then”一样响应“false”

更具体,&&测试$? 返回上一个 最近执行的语句的值,并在&&之后立即将控制传递给语句或子shell …它只传递控制,如果$? 是真的。

|| 是类似的,经常出现在&&语句之后,但是它会测试上一个最近执行的语句的错误返回值($?)… NB! ,Nota Bene! 请注意!….如果预先声明的语句是一个&&语句,当你期望它为真时重新为false,那么|| 将对错误作出回应,因此在同一行上混合两者可能会有风险

我想要提出的要点与我犯的错误有关。 即:
## [[条件]] && A || 乙
不是表现得像C / C ++风格的三元组。 即:
//(条件)? 答:B
请参阅下面的脚本,了解“A”的“意外”结果示例

基本测试和&&和|| 声明必须都在同一条线上……


运行此脚本以查看使用&&和||时出现问题的位置
最近执行的声明可能不是您期望的声明。

[[condition]] && echo Hello || echo Goodbye ….通常是安全的,
因为形成良好的回声将会回归真实。
但访问一个不退出的文件怎么样?

 #!/bin/bash # # "as expected" return codes" means: expected to behave like a normal AND / OR contition test # if [[ "$1" != "" ]] ; then exit $1; fi # recursive call to return an arbitary $? value (decimal) echo echo 'test 1: All return codes are "as expected"' echo ====== ((1==1)) && echo " ((1==1)) rc=$? ..&&.. condition is true" || echo " ((1==1)) rc=$? ..||.. condition is false" $0 0 && echo " \$0 0 rc=$? ..&&.. condition is true" || echo " \$0 0 rc=$? ..||.. condition is false" ((1!=1)) && echo " ((1!=1)) rc=$? ..&&.. condition is true" || echo " ((1!=1)) rc=$? ..||.. condition is false" $0 1 && echo " \$0 1 rc=$? ..&&.. condition is true" || echo " \$0 1 rc=$? ..||.. condition is false" echo echo 'test 2: Now throw in some "unexpected" errors into the first of the &&/|| pair' echo ====== ((1==1)) && (echo " ((1==1)) rc=$? ..&&.. condition is true"; $0 1) || echo " ((1==1)) rc=$? ..||.. condition is false" $0 0 && (echo " \$0 0 rc=$? ..&&.. condition is true"; $0 2) || echo " \$0 0 rc=$? ..||.. condition is false" ((1!=1)) && (echo " ((1!=1)) rc=$? ..&&.. condition is true"; $0 3) || echo " ((1!=1)) rc=$? ..||.. condition is false" $0 1 && (echo " \$0 1 rc=$? ..&&.. condition is true"; $0 4) || echo " \$0 1 rc=$? ..||.. condition is false" echo echo 'test 3: Now swap the order of && and || statements, using "as expected" return codes' echo ====== ((1==1)) || echo " ((1==1)) rc=$? ..||.. condition is true" && echo " ((1==1)) rc=$? ..&&.. condition is false" $0 0 || echo " \$0 0 rc=$? ..||.. condition is true" && echo " \$0 0 rc=$? ..&&.. condition is false" ((1!=1)) || echo " ((1!=1)) rc=$? ..||.. condition is true" && echo " ((1!=1)) rc=$? ..&&.. condition is false" $0 1 || echo " \$0 1 rc=$? ..||.. condition is true" && echo " \$0 1 rc=$? ..&&.. condition is false" echo echo 'test 4: With the order of && and || statements still swapped, introduce "unexpected" errors into the first of the &&/|| pair' echo ====== ((1==1)) && (echo " ((1==1)) rc=$? ..&&.. condition is true"; $0 1) || echo " ((1==1)) rc=$? ..||.. condition is false" $0 0 && (echo " \$0 0 rc=$? ..&&.. condition is true"; $0 2) || echo " \$0 0 rc=$? ..||.. condition is false" ((1!=1)) && (echo " ((1!=1)) rc=$? ..&&.. condition is true"; $0 3) || echo " ((1!=1)) rc=$? ..||.. condition is false" $0 1 && (echo " \$0 1 rc=$? ..&&.. condition is true"; $0 4) || echo " \$0 1 rc=$? ..||.. condition is false" exit 

尝试

  false && echo“你好” 

 虚假 回声“你好” 

看到不同

执行&&之后的命令(在脚本的情况下),取决于第一个命令的RETVAL(函数,如果是脚本)。 如果成功,它会强制第一个命令返回值0。 我们可以检查返回值以执行更多命令。