ではbash
、いくつかのコマンドをシリアルで実行したいことがありますが、新しいコマンドを入力する前にコマンドが終了するのを待ちたくありません。だから私はこのようなことをします:
cmd1; cmd2; cmd3
残念ながら、コマンドの1つが失敗する可能性があります。その場合、私は停止したいと思います。これを行う簡単な方法はありますが、前のコマンドの終了コードが0の場合にのみコマンドを実行し続けるようにしますか?
ではbash
、いくつかのコマンドをシリアルで実行したいことがありますが、新しいコマンドを入力する前にコマンドが終了するのを待ちたくありません。だから私はこのようなことをします:
cmd1; cmd2; cmd3
残念ながら、コマンドの1つが失敗する可能性があります。その場合、私は停止したいと思います。これを行う簡単な方法はありますが、前のコマンドの終了コードが0の場合にのみコマンドを実行し続けるようにしますか?
回答:
&&
演算子を使用、
cmd1 && cmd2 && cmd3
shellscripting、中&&
および||
演算子はC.の論理演算子の最適化実施後にモデル化されている&&
意味し、演算子、および||
手段または。UnixはCと密接に関連しており、Cでは、論理演算子の第2オペランドは、結果が第1オペランドからすでにわかっている場合は評価されません。例えば、"false && x"
あるfalse
任意のためx
、そう評価する必要はありませんx
(特に場合はx
、関数呼び出しです)。同様に"true || x"
。これは、短絡セマンティクスとも呼ばれます。
Unixでは、コマンドの戻り値を「成功完了」の真理値として解釈するのが伝統的です。終了コード0はtrue
(成功)、非ゼロはfalse
(失敗)を意味します。したがって、最初のコマンドがcmd1 && cmd2
返されると"false"
(失敗を示すゼロ以外の終了ステータス)、複合コマンドのステータスは既知です:失敗。したがって、の全体的な解釈は次のcmd1 && cmd2
ようになります。「実行しcmd1
、失敗しなかった場合は、cmd2
」これは基本的にあなたの質問に欲しいものです。
同様にOR:cmd1 || cmd2
は、「実行cmd1
、または失敗した場合」と解釈できますcmd2
。
ヒント:の長いチェーンについては&&
、set -e
スクリプトの挿入を検討してください。基本的に、セミコロン;
を&&
に変更し、いくつかの特殊なケースを使用します。
||
A || B
[短絡]論理AまたはBとまったく同じです。A || B
ある成功ときA
だった成功は、またはときA
だった失敗が、B
だっ成功。そして、A || B
ある失敗ときA
だった失敗とB
しましたfailure
。同様に&&
、論理ANDに従います。
;
(または改行)がデフォルトで行うことです。set -e
なります;
に&&
大まかに言えば、。set +e
[デフォルト]はA; B
あなたが言うことになる:run A
、そしてno-matter-what run B
。