‘&&’和’;’之间有区别吗? 标准BASH终端中的符号?
他们似乎都指示BASH开始跟随符号的另一个命令,但是有明显的区别吗?
有了这条线:
command1 && command2
如果(并且仅当)command1返回退出状态零,则将执行command2,而在此行中:
command1 ; command2
无论如何都将执行command1和command2。 分号允许您在一行上键入许多命令。
你可以尝试自己的差异:
-
ls /invalid/path && echo "hello!"
由于/ invalid / path不存在,ls无法显示目录列表。 它将失败并显示错误消息:“ls:/ invalid / path:No such file or directory”。
命令的后半部分 (echo“hello!”) 从未执行过,因为上半部分失败了。 -
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。 我们可以检查返回值以执行更多命令。