按顺序在bash脚本中执行多个命令,如果至少其中一个命令失败,则会失败

And*_*huk 33 bash

我有一个bash脚本,我用它来按顺序执行多个命令,如果序列中至少有一个命令返回非零退出代码,我需要返回非零退出代码.我知道有一个wait命令,但我不确定我是否理解如何使用它.

UPD脚本如下所示:

#!/bin/bash
command1
command2
command3
Run Code Online (Sandbox Code Playgroud)

所有命令都在前台运行.无论上一个命令返回哪个退出状态,所有命令都需要运行(因此它不能表现为"第一次出错时退出").基本上我需要收集所有退出状态并相应地返回全局退出状态.

kan*_*kan 42

去做就对了:

EXIT_STATUS=0
command1 || EXIT_STATUS=$?
command2 || EXIT_STATUS=$?
command3 || EXIT_STATUS=$?
exit $EXIT_STATUS
Run Code Online (Sandbox Code Playgroud)

如果几个命令失败,不确定它应返回哪种状态.

  • 如果你想在第一个错误后停止,你可以使用“set -e” (2认同)

Chr*_*our 8

如果顺序你的意思是管道,那么你需要pipefail在你的脚本中设置如set -o pipefail.来自man bash:

除非启用了pipefail选项,否则管道的返回状态是最后一个命令的退出状态.如果启用了pipefail,则管道的返回状态是以非零状态退出的最后(最右侧)命令的值,如果所有命令都成功退出,则返回零.如果保留字!在管道之前,该管道的退出状态是如上所述的退出状态的逻辑否定.shell在返回值之前等待管道中的所有命令终止.

如果您只是表示顺序命令,那么只需检查每个命令的退出状态,如果退出状态为零,则设置一个标志.让您的脚本返回标志的值,如:

#!/bin/bash

EXIT=0
grep -q A <<< 'ABC' || EXIT=$?  # Will exit with 0
grep -q a <<< 'ABC' || EXIT=$?  # Will exit with 1
grep -q A <<< 'ABC' || EXIT=$?  # Will exit with 0
echo $EXIT                      # Will print 1
exit $EXIT                      # Exit status of script will be 1 
Run Code Online (Sandbox Code Playgroud)

这使用逻辑运算符OR ||仅设置EXIT命令是否失败.如果多个命令失败,则脚本将返回上一个失败命令的退出状态.

如果这些命令没有在后台运行,那么wait这里不相关.