[ShellScript] $?をif-elifで使ったら死ぬよ!!

シェルスクリプトでは、$?をif-elifの分岐に使ってはダメです。

ダメな例

#!/bin/sh

func () {
    # Fatal Error
    return 3
}

func

if [ $? -eq 0 ] ;then

    echo "ok"

elif [ $? -eq 3 ]; then

    echo "Fatal Error $?"

else

    echo "Unknown Error $?"

fi
実行結果
"Unknown Error 1"

あれ??
ちょww

一瞬目が点になりました。
FatalErrorをキャッチしたと思ったら、キャッチできていません。

どういうこと?

こういうことです。
#!/bin/sh

func () {
    # Fatal Error
    return 3
}

func

if [ $? -eq 3 ] ;then
    echo "Unknown Error $?"
fi
実行結果
Unknown Error 0

そう、if の条件式が、「コマンド」であることを忘れていました。
[]コマンドは「コマンド」なので、これを実行した結果のステータスコード が $?に再代入されてしまっているのです。

正しい書き方

$?をすぐに一時変数に代入してやれば、期待通りの結果が得られます。
#!/bin/sh

func () {
    # Fatal Error
    return 3
}

func
ret=$?

if [ $ret -eq 0 ] ;then

    echo "ok"

elif [ $ret -eq 3 ]; then

    echo "Fatal Error $ret"

else

    echo "Unknown Error $ret"

fi
実行結果
"Fatal Error 3"

(これに気付かず小一時間はまった)
カテゴリ: