linux shell 终端区别,标准BASH终端中的'&&'和';'符号有区别吗? - Ubuntu问答

问题描述

他们似乎都指示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”结果示例

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

运行此脚本以查看使用&&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

参考资料

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值