プロセス終了コードに基づいてシェルスクリプトを終了する [重複] 質問する

プロセス終了コードに基づいてシェルスクリプトを終了する [重複] 質問する

複数のコマンドを実行するシェル スクリプトがあります。コマンドのいずれかがゼロ以外の終了コードで終了した場合に、シェル スクリプトを終了させるにはどうすればよいですか?

ベストアンサー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

おすすめ記事