||:只有前面的命令执行失败后才会执行后面的命令;如果前面的命令执行成功,则后面的命令就不执行
&&:只有前面的命令执行成功后才会执行后面的命令;如果前面的命令执行失败,则后面的命令就不执行
示例:
前提:现在/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"始终会都被执行。