web-dev-qa-db-ja.com

bashスクリプトを作成するときに&&に相当するものは何ですか?

これが重複する質問である場合は、事前に謝罪します。ここで質問する前に、検索/チェックに力を入れました。

私はこのようなワンライナーを書くことに慣れています:

foocommand && foocommand2 && foocommand3

前のコマンドが「成功」した場合にのみ、後続のコマンドを実行したいという考えです。

私はやや長いスクリプトを書いていますが、このワンライナーは、他の人にとっては混乱を招くコードの巨大なブロックのように見えるため、実行できません。

コマンドの間隔をあけて、スクリプトの間にコマンドの間にコメントを書きたいと思います。これをどのように実行しても、&&と同等のものがそこにありますか?

31
Mike B

あなたはこのようにそれを行うことができます:

#!/bin/sh
ls -lh &&
    # This is a comment
    echo 'Wicked, it works!'

あなたが正しく質問したことを理解できれば幸いです。

23
schaiba

シバン行を次のように変更できます

#!/bin/bash -e

エラーが発生すると、スクリプトは停止します。

38
choroba

set -eのアイデアが気に入らない場合は、ロジックを反転させることができます。

foocommand || exit 1
foocommand2 || exit 2
foocommand3 || exit 3

より便利なのは、exitを何かに置き換えて有用なエラーメッセージを出力し、終了することです。もちろん、関数の中ではreturnではなくexitが必要です。

19
tripleee

代わりにif else fiブロックを使用できます。

if foocommand; then

  # some comments

  if foocommand2; then

    # more comments

    foocommand3
  fi
fi

それはもう少し読みやすいです。

または、\を使用して、大きな1ライナーを数行に分割することもできます

foocommand && \
  # some comment
  foocommand2 && \
    # more comment
    foocommand3

しかしもちろん、これは訓練されていない目を混乱させる可能性があります。

9
Martín Canaval

ネストされたifステートメントの使用を検討できます。他のオプションは、カーリーを使用して{ true && echo hi; } || echo huh

更新1:

改行/コメントなしの例は次のとおりです。

{ { false && echo "inner true"; } && { echo "inner true" && true; } || { echo "inner false" && false; } || echo "outter false"; }
5
livingstaccato

コマンドの各シーケンスを関数に分割します。

big_block_1() {
  # ...
}
big_block_2() {
  # ...
}
big_block_3() {
  # ...
}

big_block_1 && big_block_2 && big_block_3
4
Fuad Saud

私はいつも「失敗」関数を書くのが好きです。これにより、失敗が発生したときに行うことを指定し、||パターン。次のように:

function fail() {
  echo "Failure: ${@}"
  exit 1
}

foocommand || fail "couldn't foo"
0
Dave