2017-05-03 6 views
0

私はclub.shを実行していますスクリプトのいずれかが失敗した場合、実行を終了する方法は?

inside club.shのスクリプト私は以下のスクリプトを実行しています。

test1.sh test2.sh test3.sh

私の懸念は、それを1つずつ実行する必要がありますし、TEST1が失敗した場合、それはtest2.shを実行しないであろうとtest2.shが失敗した場合、それはTEST3を実行willnotです。 sh

どうすれば確認できますか?誰にでも非常に役立つだろうという考えを示唆することができます。

おかげで、

+0

何かが失敗した場合は、すぐにスクリプトを終了するために、 'set -e'をshebangの後の行として追加することができます。 'help set'を実行してみてください。 –

+0

@MarkSetchell私たちが持っている情報から、このシナリオでは 'set -e'が少し厳しいかもしれないと思います。早期終了のための唯一の条件が 'test *'スクリプトの失敗であるならば、*任意の*エラーで 'club.sh'を強制終了するのではなく、終了コードを調べるべきです。 – Lix

答えて

4

二つのアプローチ -

まず、あなたはあなたの内側のスクリプト(test1.sh、test2.sh、...)のそれぞれの終了コードを調べ、それに応じて継続するかどうかを決定することができます -

$?前のコマンドの終了コードを返します。スクリプトがエラーなしで終了した場合は、0(ゼロ)になります。 0でないものはすべて失敗とみなされます。だから、そう、このようなものでした - test1.shは終了コードを返した場合のみ

./test1.sh && ./test2.sh && test3.sh 

-

./test1.sh # execute script 
if [[ $? != 0 ]]; then exit; fi # check return value, exit if not 0 

代わりに、以前のものが渡された場合のみ、後続のコマンドを実行します&& bashの演算子を使用することができます0(ゼロ)はtest2.shとなり、同じことがtest3.shになります。あなたのスクリプトを実行する間にいくつかのロギングまたはクリーンアップを行う必要がある場合


最初のアプローチは良いですが、あなたが唯一の失敗があった場合は実行を継続しないことを懸念しているならば、&&方法は、彼らだろう私はお勧めします。


Here is a related post dealing with the meaning behind &&

+1

終了コードはテストなしで直接使用することができます './test2.sh ||出口2 '。私の意見では読みやすい。そして、誰もが重要なものがある "エコー"と一緒に追加の行を入れることに誘惑されていません " – ULick

1

最初のコマンド/スクリプトの実行の戻り値はので、あなたのコマンドが正常に実行されたかどうかをチェックすることができ、この値を使用して$?に格納されます。

はこれを試してみてください:

bash test1.sh 
if [ $? -eq 0 ]; then # if script succeeded 
    bash test2.sh 
else 
    echo "script failed" 
fi 
1

コマンドが失敗するたびにスクリプトを終了したい場合、あなたは自分のスクリプトset -eの先頭に追加します。

#!/bin/bash 

set -e 

echo hello 
ls /root/lalala 
echo world 

それ以外の場合は、2つのオプションがあります。

最初は&&です。例えば:

echo hello && ls /some_inexistant_directory && echo world 

もう一つは、各コマンドの後に戻り値をチェックすることです:

#!/bin/bash 

echo toto 
if [ "$?" != "0" ]; then 
    exit 1 
fi 

ls /root 
if [ "$?" != "0" ]; then 
    exit 1 
fi 

echo world 
if [ "$?" != "0" ]; then 
    exit 1 
fi 
+0

[私のコメントはこちら]を見てください(http://stackoverflow.com/questions/43762381/how-to-exit-from -running-any-one-of-script-fails#comment74566630_43762381)。 'set -e'を使うと、' test * 'スクリプト内のエラーだけでなく、*すべてのエラーに対して' club.sh'を終了させます。 – Lix

+0

@Lix私は知っている、私はここにオプションをリストしています。 – yoones

0

あなただけのスクリプトの物乞いで下記に置く必要があります:

#!/bin/bash -e 
関連する問題