私は、特定の出力をエコーするためにifステートメントで終了ステータスをチェックするための最良の方法は何だろうと思っていました。
私はそれがあることを考えている
if [ $? -eq 1 ]
then
echo "blah blah blah"
fi
私が抱えている問題は、exit文がif文の前にあるということです。それは単にそのexitコードを持っていなければならないからです。
実行されるすべての コマンドは終了ステータスを持ちます。
その検査は、その行が実行される前に最後に終了したコマンドの終了状況を調べています。
そのテストが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
どちらも気にしないことに注意してください 何 エラーコードはそうではありません。特定のエラーコードだけを気にしていることがわかっている場合は、手動で$?
を確認する必要があります。
エラーを報告するために終了コード!= 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
$?
は、他のパラメーターと同様です。最終的にexit
を呼び出す前に、使用する値を保存できます。
exit_status=$?
if [ $exit_status -eq 1 ]; then
echo "blah blah blah"
fi
exit $exit_status
明示的なif
ステートメントの代替
最小限:
test $? -ne 0 || echo "something bad happened"
コンプリート:
EXITCODE=$?
test $EXITCODE -ne 0 && echo "something good happened" || echo "something bad happened";
exit $EXITCODE
便利で詳細な 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のエラー処理に関する関連する回答: