各コマンドの結果をテストするためにHUSHシェルスクリプトをどのように作成しますか?

各コマンドの結果をテストするためにHUSHシェルスクリプトをどのように作成しますか?

このスクリプトがコマンドの状態を確認し、失敗したときに終了するようにするにはどうすればよいですか?

#!/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):

  1. 複数のコマンドパイプラインで単一のコマンドが失敗しても、シェルは終了しないでください。パイプライン自体のエラーのみが考慮されます。

  2. -e、または予約語の後の複合リスト、予約語で始まるパイプ、または最後のAND-ORリストを除くすべてのコマンドを実行するときは、この設定は無視する必要があります。whileuntilifelif!

  3. -eこれは、シャットダウン状態が無視された場合の失敗の結果である場合、サブシェルコマンド以外の-e複合コマンドには適用されません。

|| exit別の方法は、各コマンドの後に失敗した場合に終了したいコマンドを追加することです。例えば

flash_eraseall -j /dev/mtd2 || exit

答え2

Bashのすべてのコマンドの後の戻りコードは$?変数に格納されます。コマンドが成功した場合、その値は次のようになります。

successfulcommand    
echo $?
0

エラーが発生した場合、結果はゼロではなく、エラーに依存します。

unsuccessfulcommand
echo $?
2

関連情報