我有以下代码段工作,以便我的bash脚本在失败时提前退出
./gradlew clean build release
if [ $? -eq 0 ]
then
echo "Successfully BUILT FAKE RELEASE"
else
echo "BUILDING FAKE RELEASE FAILED"
exit $?
fi
我看到失败日志语句但是我的脚本调用它继续而不是退出,在那个脚本中,我有几乎相同的代码
./runAllTesting.sh
if [ $? -eq 0 ]
then
echo "Successfully RAN ALL TESTING"
else
echo "TESTING SYSTEM Failed(don't release this)"
exit $?
fi
我在这里做错了什么?这是10.11.6 el capitan mac computer。
答案 0 :(得分:3)
我的脚本调用它继续
是的,您应该在调用脚本中检查代码段的退出代码,然后相应地执行
if ! ./posted_snippet.sh; then
exit
fi
以这种方式退出顶层,但丢失了导致它退出的错误代码的信息。它通常是无关紧要的,因为posted_snippet.sh
的错误消息会清楚哪个测试失败以及原因。但是,如果必须将错误代码传递给上层,则可以使用简洁形式
./posted_snippet.sh || exit $?
这比if ./posted_snippet.sh; then :; else exit $?; fi
好。
重要的是posted_snippet.sh
应该使用正确的代码退出,并且在评论中已经指出它没有。您的上一个$?
会捕获echo
的退出代码,该代码始终为0.以下是工作版本:
./runAllTesting.sh
test_result=$?
if [ $test_result -eq 0 ]; then
echo "Successfully RAN ALL TESTING"
else
echo "TESTING SYSTEM Failed(don't release this)"
exit $test_result
fi
答案 1 :(得分:2)
$?
表示执行的最后一个命令的退出状态是什么。执行的最后一个命令是echo "TESTING SYSTEM Failed(don't release this)"
,并且它成功运行。在echo语句之后你真正做的是exit 0
。解决方法是将$?
保存在变量
./gradlew clean build release
readonly status=$?
if [[ $status -eq 0 ]];then
echo "Successfully BUILT FAKE RELEASE"
else
echo "BUILDING FAKE RELEASE FAILED"
exit $status
fi
当且仅当您在脚本中的子进程中执行if条件语句时,上述解决方案才会起作用