如何使用Bash使用if语句检查退出状态

时间:2014-10-31 13:19:58

标签: linux bash shell unix

我想知道在if语句中检查退出状态以回显特定输出的最佳方法是什么。

我想到它

if [ $? -eq 1 ]
then
   echo "blah blah blah"
fi

我也遇到的问题是,exit语句在if语句之前只是因为它必须有退出代码,我知道我也做错了,因为退出wold显然会退出程序。

9 个答案:

答案 0 :(得分:169)

运行的每个命令都有退出状态。

该检查正在查看在该行运行之前最近完成的命令的退出状态。

如果您希望您的脚本在该测试返回true时退出(前一个命令失败),那么您将exit 1(或其他)放在if块之后echo

如果您正在运行该命令并希望使用以下内容测试其输出,那么通常会更直截了当。

if some_command; then
    echo command returned true
else
    echo command returned some error
fi

或者转而使用!进行否定

if ! some_command; then
    echo command returned some error
else
    echo command returned true
fi

请注意,这些都不关心错误代码是什么。如果您知道自己只关心特定的错误代码,那么您需要手动检查$?

答案 1 :(得分:120)

请注意,退出代码!= 0用于报告错误。所以,最好这样做:

retVal=$?
if [ $retVal -ne 0 ]; then
    echo "Error"
fi
exit $retVal

而不是

# will fail for error codes > 1
retVal=$?
if [ $retVal -eq 1 ]; then
    echo "Error"
fi
exit $retVal

答案 2 :(得分:32)

$?是一个与其他参数一样的参数。您可以在最终调用exit之前保存其值以供使用。

exit_status=$?
if [ $exit_status -eq 1 ]; then
    echo "blah blah blah"
fi
exit $exit_status

答案 3 :(得分:11)

为记录起见,如果脚本是使用set -e(或#!/bin/bash -e)运行的,因此您不能直接检查$?(因为脚本将终止于除零以外的任何返回码) ),但要处理特定的代码,@gboffis comment很不错:

/some/command || error_code=$?
if [ "${error_code}" -eq 2 ]; then
   ...

答案 4 :(得分:5)

使用 zsh 您可以简单地使用:

if [[ $(false)? -eq 1 ]]; then echo "yes" ;fi

当使用 bashset -e 时,您可以使用:

false || exit_code=$?
if [[ ${exit_code} -ne 0 ]]; then echo ${exit_code}; fi

答案 5 :(得分:2)

如果要编写始终首选的函数,则应传播这样的错误:

function() {
    if some_command; then
        echo "Worked"
    else
        return "${?}"
fi
}

这会将错误传播给呼叫者,以便他可以按预期进行function && next之类的事情。

答案 6 :(得分:1)

只需添加到有用且详细的answer

如果必须显式检查退出代码,则最好通过以下方式使用算术运算符(( ... ))

run_some_command
(($? != 0)) && { printf '%s\n' "Command exited with non-zero"; exit 1; }

或者,使用case语句:

run_some_command; ec=$?  # grab the exit code into a variable so that it can
                         # be reused later, without the fear of being overwritten
case $ec in
    0) ;;
    1) printf '%s\n' "Command exited with non-zero"; exit 1;;
    *) do_something_else;;
esac

有关Bash中错误处理的相关答案:

答案 7 :(得分:0)

替代显式if语句

至少:

test $? -ne 0 || echo "something bad happened"

完成:

EXITCODE=$?
test EXITCODE -ne 0 && echo "something good happened" || echo "something bad happened"; 
exit $EXIT_CODE

答案 8 :(得分:-1)

answerOo.oO是正确的。

如果您想更进一步,我将在PS1中使用此命令,以便仅在出现错误时查看每个命令的退出代码:

function ret_validate { if [ $1 != 0 ] ; then echo -n -e " Err:$1" ; fi }
PS1='${debian_chroot:+($debian_chroot)}[\t]\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\[\e[01;31m\]`ret_validate \$?`\[\e[m\] \$ '

如果要查看,只需将这些行添加到.bashrc中。