问题描述
他们似乎都指示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(无错误)时执行。
第四种办法
更新:我已经添加了脚本来高亮一些可能的陷阱:
因为no-one别提到了”||”,我会
Update2:这里有一些重要的re-wording&&就像”if”声明的”then”响应”true”
||与”if”声明的”else”不同.. ||就像”if”声明的”then”响应”false”
更具体地说,&&测试$?返回上一个最近执行的语句的值并将控制传递给语句或sub-shell紧跟在&& …之后它只传递控制,如果$?是真的。
||是类似的,经常看到&&和语句,但它测试了上一个最近执行的语句的错误返回值($?)… NB!,Nota Bene!请注意!如果预先声明是&&当你期望它是真的时,它会重新伪造,然后是||将对错误作出回应,因此在同一行上混合两者可能会有风险
我想要提出的要点与我犯的错误有关。即:## [[条件]]&& A || B不是表现得像C /C++风格的三元组。即://(条件)?答:B请参阅下面的脚本,了解”A”的”unexpected”结果示例
基本测试和&&和||声明必须都在同一条线上……
运行此脚本以查看使用&& ;;时出现问题的地方和||最近执行的声明可能不是您期望的声明。
[[条件]]&& 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
参考资料