从bash脚本读取返回代码到bash脚本?

时间:2016-12-22 22:55:22

标签: bash

我有以下代码段工作,以便我的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。

2 个答案:

答案 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条件语句时,上述解决方案才会起作用