GNU/Linux >> Linux の 問題 >  >> Linux

コマンドがゼロ以外の値を返した場合にシェルスクリプトを中止する

これをスクリプトの先頭に追加します:

set -e

これにより、単純なコマンドがゼロ以外の終了値で終了した場合、シェルはすぐに終了します。単純コマンドとは、if、while、until テストの一部ではないコマンド、または &&または || の一部ではないコマンドです。リスト。

詳細については、「set」内部コマンドの bash(1) man ページを参照してください。

私は個人的に、ほとんどすべてのシェル スクリプトを「set -e」で開始します。何かが途中で失敗し、スクリプトの残りの部分の想定が破られた場合に、スクリプトを頑固に続行するのは本当に面倒です。


終了時に必要なクリーンアップがある場合は、疑似シグナル ERR で「トラップ」を使用することもできます。これは、INT やその他の信号をトラップするのと同じように機能します。コマンドがゼロ以外の値で終了すると、bash は ERR をスローします:

# Create the trap with   
#    trap COMMAND SIGNAME [SIGNAME2 SIGNAME3...]
trap "rm -f /tmp/$MYTMPFILE; exit 1" ERR INT TERM
command1
command2
command3
# Partially turn off the trap.
trap - ERR
# Now a control-C will still cause cleanup, but
# a nonzero exit code won't:
ps aux | grep blahblahblah

または、特に「set -e」を使用している場合は、EXIT をトラップできます。トラップは、正常終了、割り込み、-e オプションによる終了など、何らかの理由でスクリプトが終了したときに実行されます。


あなたの例の if ステートメントは不要です。次のようにしてください:

dosomething1 || exit 1

Ville Laurikari のアドバイスに従って set -e を使用する場合 次に、一部のコマンドでは、これを使用する必要がある場合があります:

dosomething || true

|| true コマンドパイプラインに true を持たせます コマンドが失敗した場合でも値を返すため、-e オプションはスクリプトを強制終了しません。


受け入れられた回答に追加するには:

set -e に注意してください 特にパイプがある場合は、十分でない場合があります。

たとえば、このスクリプトがあるとします

#!/bin/bash
set -e 
./configure  > configure.log
make

...期待どおりに動作します:configure のエラー 実行を中止します。

明日、一見些細な変更を加えます:

#!/bin/bash
set -e 
./configure  | tee configure.log
make

...そして今は機能しません。これについてはこちらで説明されており、回避策 (Bash のみ) が提供されています:

#!/bin/bash
set -e 
set -o pipefail

./configure  | tee configure.log
make

Linux
  1. コマンドライン引数をシェルスクリプトに渡す方法は?

  2. シェルスクリプト内から passwd コマンドを使用する

  3. シェルスクリプトで環境変数を設定/Tomcatアプリケーションでアクセス

  1. bash:配列の環境変数を設定し、それをシェル スクリプトから参照解除すると失敗する

  2. シェル スクリプトが実行されているかどうかを確認する Linux コマンド

  3. シェルスクリプトのコマンドラインからExpectに引数を渡す方法

  1. Pythonスクリプトからシェルスクリプトへの戻り値

  2. UbuntuのPATH変数はどこに設定されていますか?

  3. シェルコマンドを使用してGDB内で環境変数を設定するには?