当前位置: 首页>>技术教程>>正文


标准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(无错误)时执行。

第四种办法

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

因为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”结果示例

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


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

[[条件]]&& 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 

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/1475.html,未经允许,请勿转载。