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

我想的是:

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

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


当前回答

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

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

其他回答

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

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

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脚本中引发错误

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

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

下面的测试脚本

简单的bash测试命令 多个测试命令 Bash测试命令包括管道:

if [[ $(echo -en "abc\n def" |grep -e "^abc") && ! $(echo -en "abc\n def" |grep -e "^def") ]] ; then
  echo "pipe true"
else
  echo "pipe false"
fi
if [[ $(echo -en "abc\n def" |grep -e "^abc") && $(echo -en "abc\n def" |grep -e "^def") ]] ; then
  echo "pipe true"
else
  echo "pipe false"
fi

输出结果为:

pipe true
pipe false

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

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

如果你想让你的脚本在测试返回true时退出(之前的命令失败),那么你可以在回显之后的If块中放入exit 1(或其他任何东西)。

话虽如此,如果您正在运行该命令并希望测试其输出,那么使用下面的方法通常更直接。

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

但是请注意,它们都不关心错误代码是什么。如果你知道你只关心一个特定的错误代码,那么你需要检查$?手动。

你可以添加这个if语句:

if [ $? -ne 0 ];
then
    echo 'The previous command was not executed successfully';
fi