Write by lyc at 2020-6-4
Linux shell的&&和||

&&,||,()

shell 在执行某个命令的时候,会返回一个返回值,该返回值保存在 shell 变量 $? 中:

  • $? == 0 时,表示执行成功;
  • $? == 1 时,表示执行失败。

有时候,下一条命令依赖前一条命令是否执行成功。如:在成功地执行一条命令之后再执行另一条命令,或者在一条命令执行失败后再执行另一条命令等。

shell 提供了 &&|| 来实现命令执行控制的功能,shell 将根据 &&|| 前面命令的返回值来控制其后面命令的执行。

1.&& 逻辑与

1
2
# 语法
$ command1 && command2 [&& command3 ...]
  1. 命令之间使用 && 连接,实现逻辑与的功能。
  2. 只有在 && 左边的命令返回真(命令返回值 $? == 0),&& 右边的命令才会被执行。
  3. 只要有一个命令返回假(命令返回值 $? != 0),后面的命令就不会被执行。

2.|| 逻辑或

1
2
# 语法
$ command1 || command2 [|| command3 ...]
  1. 命令之间使用 || 连接,实现逻辑或的功能。
  2. 只有在 || 左边的命令返回假(命令返回值 $? != 0),|| 右边的命令才会被执行。这和 c 语言中的逻辑或语法功能相同,即实现短路逻辑或操作。
  3. 只要有一个命令返回真(命令返回值 $? == 0),后面的命令就不会被执行。

3.() 命令组合

1
2
# 语法
$ (command1;command2[;command3...])
  1. 一条命令需要独占一个物理行,如果需要将多条命令放在同一行,命令之间使用命令分隔符(;)分隔。执行的效果等同于多个独立的命令单独执行的效果。
  2. () ==表示在当前 shell 中将多个命令作为一个整体执行==。需要注意的是,使用 () 括起来的命令在执行前面都不会切换当前工作目录,也就是说命令组合都是在当前工作目录下被执行的,尽管命令中有切换目录的命令。
  3. 命令组合常和命令执行控制&&||结合起来使用。

例:

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