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
