提问人:deadcell4 提问时间:10/31/2014 最后编辑:Paulo Mattosdeadcell4 更新时间:7/18/2023 访问量:834850
如何使用“if”语句检查退出状态
How to check the exit status using an 'if' statement
问:
检查语句中的退出状态以回显特定输出的最佳方法是什么?if
我正在考虑它是:
if [ $? -eq 1 ]
then
echo "blah blah blah"
fi
我还遇到的问题是,该语句位于语句之前,仅仅是因为它必须具有该退出代码。另外,我知道我做错了什么,因为退出显然会退出程序。exit
if
答:
每个运行的命令都有一个退出状态。
该检查正在查看在该行运行之前最近完成的命令的退出状态。
如果您希望脚本在该测试返回 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
请注意,这些都不关心错误代码是什么。如果您知道您只关心特定的错误代码,则需要手动检查。$?
评论
a_command || return 1
return
exit
dash
return
exit
dash
return
if <command>
if ! some_command | some_other_command
set -o pipefail
if
if [[ ${PIPESTATUS[0]} -ne 0 ]]
set -e
|| true
if
$?
是与任何其他参数一样的参数。您可以保存其值以在最终调用 之前使用 。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
评论
dnf
# will fail for error codes > 1
但检查错误代码是否等于 1?$retVal -eq 1
显式语句的替代方法if
微:
test $? -eq 0 || echo "something bad happened"
完成:
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 中的错误处理的相关答案:
评论
$?
(( $? != 0 ))
[[ $? -ne 0 ]]
(( $retVal )) && echo 'ERROR'
(( $retVal != 0 ))
[[ $retVal -ne 0 ]]
作为记录,如果脚本使用 (或 ) 运行,因此您无法直接检查(因为脚本将在除零以外的任何返回代码上终止),但想要处理特定代码,@gboffis注释很棒:set -e
#!/bin/bash -e
$?
/some/command || error_code=$?
if [ "${error_code}" -eq 2 ]; then
...
评论
/some/command
error_code
/bin/mkdir
/usr/bin/file
|| is_fail=true; if [ "$is_fail" = true ]; then . . .
error_code
仅当返回状态为非零时才会设置。/some/command
如果你正在编写一个函数(这始终是首选的),你可以像这样传播错误:
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 和 is on 时,可以使用: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
你可以添加这个if语句:
if [ $? -ne 0 ];
then
echo 'The previous command was not executed successfully';
fi
我缺少最简单的解决方案,就是使用运算符:&&
command --with parameters && echo "Command completed succesfully"
-- 假设成功时返回 0,失败时返回非零,正如 Bash 所期望的那样(这与许多编程语言相反!command
该运算符可用于故障:||
commamnd --with parameters || echo "Command failed"
这是一个可以正常处理的解决方案:set -euo pipefail
# ...
some-command && true
SOME_COMMAND_EXIT_STATUS="$?"
# ...
例
#!/bin/bash
set -euo pipefail
# due to "set -e", using " ... && true" construct to avoid script from
# exiting immediately on expectable nonzero exit code.
# As per the Bash Reference Manual:
#
# "[...] The shell does not exit if the command that fails is
# [...] part of any command executed in a && or || list
# [as long as it isn't the final command in this list]"
#
# see https://www.gnu.org/software/bash/manual/html_node/Lists.html
# see "-e" at https://www.gnu.org/software/bash/manual/html_node/The-Set-Builtin.html
some-command && true
SOME_COMMAND_EXIT_STATUS="$?"
if [[ "$SOME_COMMAND_EXIT_STATUS" == 4 ]]; then
echo "some-command exit status was 4"
else
echo "some-command exit status was unequal 4"
fi
评论
some_program; rc=$?; if [ ${rc} -eq 1 ] .... fi ; exit ${rc}