複数のコマンドを実行するシェル スクリプトがあります。コマンドのいずれかがゼロ以外の終了コードで終了した場合に、シェル スクリプトを終了させるにはどうすればよいですか?
ベストアンサー1
各コマンドの後、終了コードは変数内に格納される$?
ため、次のようになります。
ls -al file.ext
rc=$?; if [[ $rc != 0 ]]; then exit $rc; fi
$?
パイプされたコマンドでは、パイプ内の最後の要素の戻りコードのみが返されるため、次のコードでは注意が必要です。
ls -al file.ext | sed 's/^/xx: /"
ファイルが存在しない場合はエラー コードは返されません (sed
パイプラインの一部が実際に機能し、0 を返すため)。
シェルbash
は実際に、そのような場合に役立つ配列を提供します。それは ですPIPESTATUS
。この配列には、パイプライン コンポーネントごとに 1 つの要素があり、次のように個別にアクセスできます${PIPESTATUS[0]}
。
pax> false | true ; echo ${PIPESTATUS[0]}
1
これはパイプライン全体ではなく、コマンドの結果を取得することに注意してくださいfalse
。必要に応じて、リスト全体を取得して処理することもできます。
pax> false | true | false; echo ${PIPESTATUS[*]}
1 0 1
パイプラインから最大のエラー コードを取得したい場合は、次のようなものを使用できます。
true | true | false | true | false
rcs=${PIPESTATUS[*]}; rc=0; for i in ${rcs}; do rc=$(($i > $rc ? $i : $rc)); done
echo $rc
これは各PIPESTATUS
要素を順番に調べ、rc
前の値より大きい場合はそれを保存しますrc
。