3

次のコードセグメントは、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 ]]
4

1 に答える 1

6

これは、最後に実行されたコマンド$?の戻りコードであるためです。の前にコマンドを実行しているので、テストしているのはその戻りコードであり、常に0になります。echoifecho

また、あなたの場合、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
于 2012-11-08T15:38:34.467 に答える