1. ホーム
  2. バッシュ

[解決済み】プロセス終了コードに基づくシェルスクリプトの終了 [重複]。

2022-03-24 11:26:53

質問

いくつかのコマンドを実行するシェルスクリプトを持っています。いずれかのコマンドが0以外の終了コードで終了した場合、シェルスクリプトを終了させるにはどうすればよいですか?

解決方法を教えてください。

各コマンドの後、終了コードは $? 変数があるので、次のようなものになります。

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 の値を指定します。