これをスクリプトの先頭に追加します:
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