bash if block每次都转到else

时间:2012-11-08 15:33:43

标签: bash

以下代码段应转到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循环。

我做错了什么?


以下是我尝试过的条件比较的变体导致了同样的问题:

  1. if [ $? -eq 5 ]
  2. if [ $? -eq "5" ]
  3. if [ $? == 5 ]
  4. if [ $? == "5" ]
  5. if [[ $? -eq 5 ]]
  6. if [[ $? -eq "5" ]]
  7. if [[ $? == "5" ]]
  8. if [[ $? == 5 ]]

1 个答案:

答案 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