このスクリプトがコマンドの状態を確認し、失敗したときに終了するようにするにはどうすればよいですか?
#!/bin/sh
echo JFFS2 Preparation
cd /root
/root/config 1 > /root/formatted
if grep "PAR_JFFS2_FORMATTED = -1" /root/formatted; then
echo Need to Format MTD2
rm -f /root/formatted
flash_eraseall -j /dev/mtd2
echo Marking file system as formatted
/root/config 1 1355270400
mount -t jffs2 -o noatime /dev/mtdblock2 /mnt
echo "Formmatted" > /mnt/formatted.txt
else
mount -t jffs2 -o noatime /dev/mtdblock2 /mnt
fi
答え1
set -e
これをスクリプトの前半に追加するか、#!
行をに変更すると#!/bin/sh -e
同じ効果が得られます。
これはerrexit
シェルオプションを設定します。つまり、次の例外を除いて、コマンドがゼロ以外の終了状態を返すとすぐにスクリプトが終了します(から取得)。POSIXの説明set
):
複数のコマンドパイプラインで単一のコマンドが失敗しても、シェルは終了しないでください。パイプライン自体のエラーのみが考慮されます。
-e
、または予約語の後の複合リスト、予約語で始まるパイプ、または最後のAND-ORリストを除くすべてのコマンドを実行するときは、この設定は無視する必要があります。while
until
if
elif
!
-e
これは、シャットダウン状態が無視された場合の失敗の結果である場合、サブシェルコマンド以外の-e
複合コマンドには適用されません。
|| exit
別の方法は、各コマンドの後に失敗した場合に終了したいコマンドを追加することです。例えば
flash_eraseall -j /dev/mtd2 || exit
答え2
Bashのすべてのコマンドの後の戻りコードは$?
変数に格納されます。コマンドが成功した場合、その値は次のようになります。
successfulcommand
echo $?
0
エラーが発生した場合、結果はゼロではなく、エラーに依存します。
unsuccessfulcommand
echo $?
2