shell 逻辑运算符 &&,,()
Write by lyc at 2020-6-4
Linux shell的&&和||
&&,||,()
shell 在执行某个命令的时候,会返回一个返回值,该返回值保存在 shell 变量 $?
中:
- 当
$? == 0
时,表示执行成功; - 当
$? == 1
时,表示执行失败。
有时候,下一条命令依赖前一条命令是否执行成功。如:在成功地执行一条命令之后再执行另一条命令,或者在一条命令执行失败后再执行另一条命令等。
shell 提供了 &&
和 ||
来实现命令执行控制的功能,shell 将根据 &&
或 ||
前面命令的返回值来控制其后面命令的执行。
1.&& 逻辑与
1 | # 语法 |
- 命令之间使用
&&
连接,实现逻辑与的功能。 - 只有在
&&
左边的命令返回真(命令返回值$? == 0
),&&
右边的命令才会被执行。 - 只要有一个命令返回假(命令返回值
$? != 0
),后面的命令就不会被执行。
2.|| 逻辑或
1 | # 语法 |
- 命令之间使用
||
连接,实现逻辑或的功能。 - 只有在
||
左边的命令返回假(命令返回值$? != 0
),||
右边的命令才会被执行。这和 c 语言中的逻辑或语法功能相同,即实现短路逻辑或操作。 - 只要有一个命令返回真(命令返回值
$? == 0
),后面的命令就不会被执行。
3.() 命令组合
1 | # 语法 |
- 一条命令需要独占一个物理行,如果需要将多条命令放在同一行,命令之间使用命令分隔符
(;)
分隔。执行的效果等同于多个独立的命令单独执行的效果。 ()
==表示在当前 shell 中将多个命令作为一个整体执行==。需要注意的是,使用()
括起来的命令在执行前面都不会切换当前工作目录,也就是说命令组合都是在当前工作目录下被执行的,尽管命令中有切换目录的命令。- 命令组合常和命令执行控制
&&
或||
结合起来使用。
例:
1 | sh "ssh -p22 -o StrictHostKeyChecking=no root@${ip} '/usr/local/python3/bin/supervisorctl restart ${APP_NAME}' || (ssh -p22 -o StrictHostKeyChecking=no root@${ip} '/usr/bin/tail -20 /data/supervisord_logs/${APP_NAME}.err';return 1)" |
- supervisorctl 重启成功,
||
后面不会执行 - supervisorctl 重启失败,执行
||
后面,打印出 .err 日志,并返回值$?=1