如何使用'if'声明

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

我想的是:

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

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

701404 次浏览

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

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

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

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

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

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

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

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

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

显式if语句的替代方案

最低限度:

# EYZ0

完成:

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

只是为了补充有用和详细的回答:

如果你必须显式检查退出代码,最好使用算术运算符(( ... )),如下所示:

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

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

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

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

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

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

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

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

当使用Bash和set -e是打开的,你可以使用:

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

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

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