web-dev-qa-db-ja.com

Bashを使用してifステートメントを使用して終了ステータスを確認する方法

私は、特定の出力をエコーするためにifステートメントで終了ステータスをチェックするための最良の方法は何だろうと思っていました。

私はそれがあることを考えている

if [ $? -eq 1 ]
then
   echo "blah blah blah"
fi

私が抱えている問題は、exit文がif文の前にあるということです。それは単にそのexitコードを持っていなければならないからです。

154
deadcell4

実行されるすべての コマンドは終了ステータスを持ちます。

その検査は、その行が実行される前に最後に終了したコマンドの終了状況を調べています。

そのテストがtrueを返したとき(前のコマンドが失敗したとき)に your スクリプトを終了させたい場合は、ifブロックの後のechoブロック内にexit 1(またはなんでも)を置きます。

あなたがコマンドを実行していて、以下を使ってその出力をテストしたいならば、それはしばしばもっと簡単です。

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

どちらも気にしないことに注意してくださいエラーコードはそうではありません。特定のエラーコードだけを気にしていることがわかっている場合は、手動で$?を確認する必要があります。

163
Etan Reisner

エラーを報告するために終了コード!= 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
118
Oo.oO

$?は、他のパラメーターと同様です。最終的にexitを呼び出す前に、使用する値を保存できます。

exit_status=$?
if [ $exit_status -eq 1 ]; then
    echo "blah blah blah"
fi
exit $exit_status
33
chepner

明示的なifステートメントの代替

最小限:

test $? -ne 0 || echo "something bad happened"

コンプリート:

EXITCODE=$?
test $EXITCODE -ne 0 && echo "something good happened" || echo "something bad happened"; 
exit $EXITCODE
2
Catskul

便利で詳細な 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のエラー処理に関する関連する回答:

1
codeforester