以下代码段应转到else
语句进入elif
。
#The following line returns 3, 4 or 5 as the exit code.
$BASH_EXEC adbE.sh "adb $ARGUMENT install $f"
echo "the return code:$?."
if [ $? -eq 5 ]
then
#do nothing, success
continue
elif [ $? -eq 4 ]
then
echo "WARNING"
else
echo "ERROR"
break
fi
这一部分:echo "the return code:$?."
将此回显到屏幕:the return code:4.
并且它不会显示WARNING
。它只显示ERROR
,然后中断此代码所包含的for
循环。
我做错了什么?
以下是我尝试过的条件比较的变体导致了同样的问题:
if [ $? -eq 5 ]
if [ $? -eq "5" ]
if [ $? == 5 ]
if [ $? == "5" ]
if [[ $? -eq 5 ]]
if [[ $? -eq "5" ]]
if [[ $? == "5" ]]
if [[ $? == 5 ]]
答案 0 :(得分:5)
原因是$?
是最后执行的命令的返回码。您正在echo
之前运行if
命令,因此它正在测试的返回码echo
,它始终为0。
此外,在您的情况下,由于您正在重新测试elif
语句中的返回值而导致另一个问题。初始测试(即[ $? -eq 5 ]
)也会更改$?
的值,因此重新测试会产生意外结果。
要解决此问题,请在执行echo
之前保存以前的返回代码,然后将保存的版本用于以后的所有测试:
ret=$?
echo "the return code:${ret}."
if [ ${ret} -eq 5 ]
then
#do nothing, success
continue
elif [ ${ret} -eq 4 ]
then
echo "WARNING"
else
echo "ERROR"
break
fi