我有一个简单的 bash 脚本,可以执行许多其他脚本……
#/bin/bash
…
./update_artifact1.sh $ARTIFACT_VERSION
./update_artifact2.sh $ARTIFACT_VERSION
./update_artifact3.sh $ARTIFACT_VERSION
问题是,如果第一个命令(或第二个命令)因错误而终止,则不会运行任何后续命令。有没有办法可以运行所有三个命令,保存每个命令的退出状态,然后如果所有三个命令都成功执行,则返回成功退出状态?脚本不必同时运行。
答案1
您可以用这种方式稍微修改一下脚本
#!/bin/bash
…
./update_artifact1.sh $ARTIFACT_VERSION
exit_state_1=$?
./update_artifact2.sh $ARTIFACT_VERSION
exit_state_2=$?
./update_artifact3.sh $ARTIFACT_VERSION
exit_state_3=$?
exit_state_all=$[ $exit_state_1 && $exit_state_2 && $exit_state_3 ]
exit $exit_state_all
笔记:
bash
每个命令都会返回一个存储在中的退出代码$?
。0
如果没有错误,则为 ,如果有错误,则为不同的数字。
每行之后的值$?
都会更新,因此您需要将其存储在一个变量中(在本例中我们使用了exit_state_1
...exit_state_n
)。
最后,如果一切正常,您希望脚本只返回一个错误代码 0,我们用 来实现它$[ $a || $b || $c ]
。
请注意,为$[ 0|| 0 || 0 ]
0,同时$[ $a || $b || $c ]
至少有一个$a,$b,$c
不等于时0
返回 1。- 重要的是!在第一行,你必须写信
#!/bin/bash
告诉系统这是一个必须在bash
shell 中执行的脚本。
你可能会对阅读更多关于舍邦这里。 - 正如注释中所述,如果您将
set -e
脚本中的某处放在这些行之前,则脚本将在第一个错误处中断,而不会处理另一行,并且它将返回错误代码(最后执行的命令之一)。