&&和||区别
写在前面
今天看到linux书籍介绍&&和||的区别时,说&&把两个命令连接在一起时,只有当第一个命令成功时(即返回值为0)才运行第二个命令。而||把两个命令连接在一起时,只有当第一个命令不成功时(即返回值为非0)才运行第二个命令。当时想了一会原因直接想懵了,我想着使用&&时,返回值为0了,就可以直接判断&&的结果了,所以第二条命令不会执行,结果是返回值为0了才要执行第二条命令。上网搜索了原因才知道是自己想岔了。
&&执行过程
语法格式如下:
command1 && command2 [&& command3 ...]
当使用&&连接两条命令时,正确的运行过程是第一条命令执行成功后,然后执行第二条命令。第一条命令执行成功之后,返回值是0,但是第一条命令的返回值不是&&的比较值,而是让第一条命令的返回值与0进行比较(即$? == 0)的结果作为&&的比较值。第一条命令执行成功时,$? == 0的结果为True,还无法确定&&的最终结果,所以还需要执行第二条命令才能知道&&的最终结果。当第一条命令执行不成功(即返回值非0),$? == 0的结果为False,所以对于&&来说发生短路,&&的最终结果就是指令执行成功,第二条指令才会执行。
&&的使用应该是连接那些逻辑上具有顺序关系的命令,例如只有当成功创建一个文件夹时,才可以进入文件夹并进行相关操作,如果失败就不要进入文件夹了。
mkdir new && cd new
||执行过程
语法格式如下:
command1 || command2 [|| command3 ...]
而当使用||连接两条命令时,正确的运行过程是第一条命令执行失败后,然后执行第二条命令。第一条命令执行失败之后,返回值为非0,$? == 0的结果为False,还无法知道||的最终结果,所以还需要执行第二条命令才能知道||的最终结果。当第一条命令执行成功(即返回值为0),$? == 0的结果为True,所以对于||来说发生短路,||的最终结果就是指令执行成功,第二条指令不执行。
||适用于那些可替换命令的连接,例如如果删除一个文件夹,事先不知道文件夹中有内容,那么会删除失败,如果此时在||右边使用强制删除选项,那么文件夹一定能删除。
rm new || rm -rf new
linux部分符号的用法
符号 | 说明 |
---|---|
& | 让命令在后台运行 |
| | 管道 |
&& | 当前面的命令执行成功时,后面的命令才会执行 |
|| | 当前面的命令执行成功时,后面的命令不再执行 |
> | 标准输出重定向(文件存在先删除文件,然后写入内容,不存在则创建) |
>> | 标准输出重定向(在文件最后添加) |
2> | 标准错误重定向 |
< | 标准输入重定向 |
2>> | 标准错误重定向(在文件最后添加) |
&> | 标准输出、标准错误重定向 |
; | 什么也不做,返回值为0 |
linux中符号太多了,符号之间相互组合又有不同的含义,全都记住也不太可能,还是要多靠平时的积累。