我需要运行脚本中的一些命令,它是源代码的自定义 linter。每次运行都会生成一份报告,如果违反规则,则会失败并返回退出代码 1。我需要在失败之前运行所有命令来生成报告,如果任何命令因非零退出代码而失败,则失败。该脚本不起作用,因为它在第一个错误时存在:
lint ./module1/src/main/java && lint ./module2/src/main/java && lint module3/src/main/java
现在我正在使用这个脚本:
lint ./module1/src/main/java
code1="$?"
lint ./module2/src/main/java
code2="$?"
lint ./module3/src/main/java
code3="$?"
if [[ "$code1" != "0" || "$code2" != "0" || "$code3" != "0" ]]; then
exit 1
fi
但它看起来过于复杂并且不可扩展(我需要添加额外的变量并检查下一个命令)。
是否可以使这个脚本更加优雅?
答案1
如果您希望完成所有测试,然后返回最终的总体状态代码,那么您就必须这样编码。这是一种方法
#!/bin/bash
#
ss=0
lint ./module1/src/main/java || ((ss++))
lint ./module2/src/main/java || ((ss++))
lint ./module3/src/main/java || ((ss++))
exit $ss
正如所写的,它失败并显示与失败测试数量相对应的退出代码。您仍然可以测试真/假(零/非零),但如果您需要代码1
在任何一个情况下精确退出或者更多测试失败,改为((ss++))
整个ss=1
。
答案2
这有点像黑客,但您可以用于xargs
此目的。默认情况下,它运行所有命令,如果其中任何命令失败,则以状态 123 退出。
在这里,我们运行三个命令,所有命令都失败,但都执行了:
echo '
echo 1 && exit 1
echo 2 && exit 1
echo 3 && exit 1
' | xargs -d "\n" -L1 -I{} bash -c {}
该命令以退出状态 123 (GNU xargs) 退出,但输出以下内容,显示所有三个命令均已运行:
1
2
3
一组类似的命令均成功退出,状态为 0:
echo '
echo 1 && exit 0
echo 2 && exit 0
echo 3 && exit 0
' | xargs -L1 -I{} bash -c {}
正如您所期望的,这里的退出状态为 0。