shell 下一个 || 和 &&问题

                                              

shell 下一个 || 和 &&问题

【问题】
如果文件存在,就以0为码退出;如果文件不存在,显示"not exists"以后以100为码退出;
【问题代码】
test -e $1 || ( echo "$1 not exists" && exit 100)
exit 0
【现象】
无论文件是否存在,都从exit 0退出了,exit 100似乎没有得到调用。
如果改成
test -e $1 ||  echo "$1 not exists" && exit 100
exit 0
则无论文件是否存在,都从exit 100退出了,exit 0得不到执行。
【解决】
使用{}代替()
【分析】
在Bash shell中,()的意义是启动一个sub-shell,其中的( ... && exit 100)指退出这个sub-shell,后面的代码还是要执行的;{}才是真正的“代码块”标记。

有什么不对的地方,请大家指正。
关于()的意义和用法,哪位可以深入地讲讲?

回复

请看:

$a=10
$[ $a -eq 20 ] || echo "hello"  #输出hello
hello
$[ $a -eq 10 ] || echo "hello" #没有输出hello

这和C语言中是一样的 增加执行效率 当||运算的前一个表达式已经不成立的时候 ,||后面的语句没有必要执行



所以

test -e $1 || (echo "$1 not exists" && exit 100)
exit 0
当$1存在的时候,后面的()里面的内容没有执行,而执行exit 0
当$1不存在的时候,执行()里面的内容在sub-shell中 , 并且sub-shell返回100给当前shell,
然后还要执行当前shell的最后一条语句exit 0
所以不管$1是否存在都会以0退出


如果改成
test -e $1 ||  echo "$1 not exists" && exit 100

我们先来看|| &&的优先级

$echo "a" || echo "b" && echo "c"
a
c
这里可以看到先||再&&,  
它先运算 a||b , 如果a||b为真那么运行c,否则不运行c,也是为了效率&&符号左边如果已经不成立了 那么直接跳出这个逻辑运算

而这里test -e $1 ||  echo "$1 not exists" && exit 100
-e $1 ||  echo "$1 not exists"  这部分的 echo 无论怎么运行返回都是真,所以无论文件是否存在前面的 || 运算都是真 它一定会去执行后面的exit 100

解决
同上 () {}

<script type=text/javascript charset=utf-8 src="http://static.bshare.cn/b/buttonLite.js#style=-1&uuid=&pophcol=3&lang=zh"></script> <script type=text/javascript charset=utf-8 src="http://static.bshare.cn/b/bshareC0.js"></script>
阅读(484) | 评论(0) | 转发(0) |
0

上一篇:Bash中的变量

下一篇:bash中的变量 2

给主人留下些什么吧!~~
评论热议
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值