Linux中的 || 和 &&

||:只有前面的命令执行失败后才会执行后面的命令;如果前面的命令执行成功,则后面的命令就不执行
&&:只有前面的命令执行成功后才会执行后面的命令;如果前面的命令执行失败,则后面的命令就不执行

示例:
前提:现在/tmp目录下已经有一个file文件
[kashu@kashu tmp]$ ls /tmp/file
/tmp/file

当/tmp/file不存在时,才会在tmp下面创建一个file文件(若file文件存在则不创建),并且还会在该file文件中写入数字“1”
[kashu@kashu tmp]$  ll /tmp/file || touch /tmp/file && echo 1 > /tmp/file
-rw-rw-r--. 1 kashu kashu 4 Mar 28 13:00 /tmp/file

检查一下,有/tmp/file文件这个文件,该文件有一个数字“1”
[kashu@kashu tmp]$ cat /tmp/file
1

现在把/tmp下面的file文件删除,再去执行之前的那条命令:
[kashu@kashu tmp]$ rm -f file

当/tmp/file不存在时,才会在tmp下面创建一个file文件(若file文件存在则不创建),并且会在该file文件中写入数字“1”
[kashu@kashu tmp]$  ll /tmp/file || touch /tmp/file && echo 1 > /tmp/file
ls: cannot access /tmp/file: No such file or directory(由于/tmp/file文件已经不存在了,所以才会执行后面的touch /tmp/file命令)

检查一下,有/tmp/file文件这个文件,该文件有一个数字“1”
[kashu@kashu tmp]$ cat /tmp/file
1

分析命令
[kashu@kashu tmp]$ ll file(因为这个文件是已经存在的)
-rw-rw-r--. 1 kashu kashu 2 Mar 28 13:03 file

[kashu@kashu tmp]$ ll /tmp/file;echo $?(所以当我们在执行ll /tmp/file后的命令回传值是0,表示执行成功,紧随||后的touch /tmp/file命令就不会执行)
-rw-rw-r--. 1 kashu kashu 2 Mar 28 13:03 /tmp/file
0

[kashu@kashu tmp]$ ll /tmp/file || touch /tmp/file ; echo $?(可以看到,当那个file文件存在是,不论是单独执行ll /tmp/file,还是结合执行ll /tmp/file || touch /tmp/file命令,执行后的命令回传值都是0,表示执行成功)
-rw-rw-r--. 1 kashu kashu 2 Mar 28 13:03 /tmp/file
0

后面还有一部分&& echo 1 > /tmp/file命令,因为前面的命令是执行成功的,所以&&后面的命令才会继续执行。
因此,整条命令(ll /tmp/file || touch /tmp/file && echo 1 > /tmp/file)就顺利地成功执行了。

分析命令
[kashu@kashu tmp]$ rm -f file(因为file文件被删除了)
[kashu@kashu tmp]$ ll /tmp/file;echo $?(当执行ll /tmp/file时必然失败,因为该文件找不到了,进而你就会看到执行后的命令回传值为非0的值)
ls: cannot access /tmp/file: No such file or directory
2

[kashu@kashu tmp]$ ll /tmp/file || touch /tmp/file;echo $?(由于ll /tmp/file这部分命令执行失败,后面的touch /tmp/file命令就会被执行,且touch /tmp/file命令执行成功后返回的命令回传值为0,所以&&后面的命令才会被继续执行)
ls: cannot access /tmp/file: No such file or directory
0

后面还有一部分&& echo 1 > /tmp/file命令,因为前面的命令执行成功了,所以&&后面的命令才会继续执行。
因此,整条命令ll /tmp/file || touch /tmp/file && echo 1 > /tmp/file)就顺利地成功执行了。

如果真要使用判断,那么这个&&与||的顺序就不能搞错。一般来说,假设判断式有三个也就是:
command1 && command2 || command3
而且顺序通常不会变,因为一般来说,command2和command3会放置肯定可以执行成功的命令。
示例:
ls /tmp/file && echo "exist" || echo "not exist"
若/tmp/file文件存在,则显示“exist”,若不存在则显示“not exist”
但反过来就不行(ls /tmp/file || echo "not exist" && echo "exist"),因为当该文件不存在时,echo "not exist" && echo "exist"始终会都被执行。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值