为了回显特定的输出,在if语句中检查退出状态的最佳方法是什么?

我想的是:

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

我还遇到的问题是,退出语句是在if语句之前,因为它必须有退出代码。此外,我知道我做错了什么,因为退出显然会退出程序。


当前回答

再补充一下这个有用而详细的答案:

如果必须显式检查退出代码,最好使用算术运算符((…)),往这个方向:

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错误处理相关解答:

在Bash脚本中引发错误

其他回答

再补充一下这个有用而详细的答案:

如果必须显式检查退出代码,最好使用算术运算符((…)),往这个方向:

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错误处理相关解答:

在Bash脚本中引发错误

注意,退出代码!= 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

这可能只在有限的用例集中有用,我特别在需要捕获命令的输出并在退出代码报告出错时将其写入日志文件时使用这种方法。

RESULT=$(my_command_that_might_fail)
if (exit $?) 
then
    echo "everything went fine."    
else
    echo "ERROR: $RESULT" >> my_logfile.txt
fi

使用Z shell (zsh),你可以简单地使用:

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

当使用Bash并设置-e为on时,您可以使用:

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

如果你正在编写一个函数——这总是首选的——你可以像这样传播错误:

function()
{
    if <command>; then
        echo worked
    else
        return
    fi
}

现在,调用者可以像预期的那样执行function && next !如果你在if块中有很多事情要做,这是很有用的(否则有一行程序)。使用false命令可以很容易地测试它。