我想知道在if语句中检查退出状态以回显特定输出的最佳方法是什么。
我想到它
if [ $? -eq 1 ]
then
echo "blah blah blah"
fi
我也遇到的问题是,exit语句在if语句之前只是因为它必须有退出代码,我知道我也做错了,因为退出wold显然会退出程序。
答案 0 :(得分:169)
运行的每个命令都有退出状态。
该检查正在查看在该行运行之前最近完成的命令的退出状态。
如果您希望您的脚本在该测试返回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
请注意,这些都不关心错误代码是什么。如果您知道自己只关心特定的错误代码,那么您需要手动检查$?
。
答案 1 :(得分:120)
请注意,退出代码!= 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
答案 2 :(得分:32)
$?
是一个与其他参数一样的参数。您可以在最终调用exit
之前保存其值以供使用。
exit_status=$?
if [ $exit_status -eq 1 ]; then
echo "blah blah blah"
fi
exit $exit_status
答案 3 :(得分:11)
为记录起见,如果脚本是使用set -e
(或#!/bin/bash -e
)运行的,因此您不能直接检查$?
(因为脚本将终止于除零以外的任何返回码) ),但要处理特定的代码,@gboffis comment很不错:
/some/command || error_code=$?
if [ "${error_code}" -eq 2 ]; then
...
答案 4 :(得分:5)
使用 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
答案 5 :(得分:2)
如果要编写始终首选的函数,则应传播这样的错误:
function() {
if some_command; then
echo "Worked"
else
return "${?}"
fi
}
这会将错误传播给呼叫者,以便他可以按预期进行function && next
之类的事情。
答案 6 :(得分:1)
只需添加到有用且详细的answer:
如果必须显式检查退出代码,则最好通过以下方式使用算术运算符(( ... ))
:
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中错误处理的相关答案:
答案 7 :(得分:0)
替代显式if
语句
至少:
test $? -ne 0 || echo "something bad happened"
完成:
EXITCODE=$?
test EXITCODE -ne 0 && echo "something good happened" || echo "something bad happened";
exit $EXIT_CODE
答案 8 :(得分:-1)
如果您想更进一步,我将在PS1中使用此命令,以便仅在出现错误时查看每个命令的退出代码:
function ret_validate { if [ $1 != 0 ] ; then echo -n -e " Err:$1" ; fi }
PS1='${debian_chroot:+($debian_chroot)}[\t]\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\[\e[01;31m\]`ret_validate \$?`\[\e[m\] \$ '
如果要查看,只需将这些行添加到.bashrc
中。