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

我想的是:

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

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


当前回答

为了记录,如果脚本使用set -e(或#!/bin/bash -e),因此不能检查$?直接(因为脚本会在任何返回代码上终止,而不是0),但想要处理特定的代码,@gboffis注释很好:

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

其他回答

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

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

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

显式if语句的替代

最低限度:

测试$ ?-eq 0 || echo“发生了不好的事情”

完成:

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

为了记录,如果脚本使用set -e(或#!/bin/bash -e),因此不能检查$?直接(因为脚本会在任何返回代码上终止,而不是0),但想要处理特定的代码,@gboffis注释很好:

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

下面的测试脚本

简单的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