Bashの論理すべて/すべて

Bashの論理すべて/すべて

一連のテスト(それぞれ異なるPIDで)を実行し、すべてのテストが正常に終了した場合にのみ成功ステータスを取得したいと思います。それはまるで

check $PID1 && check $PID2 && check $PID3

しかし、不確実な数のテストの場合。どうすればいいですか?

答え1

これをループで書くことはそれほど難しくありません。

pids=(1025 3425 6474)
check_all() {
    for pid in "$@"; do
        if ! check "$pid"; then
            return 1
        fi
    done
}
check_all "${pids[@]}"

リンクされたコマンドチェーンと同様に、&&この機能は最初の失敗時に停止しますcheck

しかし、変数などを単一の配列に置き換えましたPID1PID2Bashは名前が特定の文字列で始まる変数を繰り返すことができますが、配列はより便利です。 (これらの変数が正しい配列を渡すことができない環境を介してスクリプトの外部から来る場合は除外されます。)

checkまた、ここのループにコマンドをハードコーディングしました。さまざまなコマンドを渡すことで関数を実行できますが、これは単語の分離や引用の処理に問題があります。 (望むよりここそしてここ.)

答え2

-eエラーが発生した場合は、exit()を使用してそれをサブシェルに入れることができます。

pids=(1025 3425 6474)
(
    set -e
    for pid in "${pids[@]}"; do
        check "$pid"
    done
)
echo $?

|| exit 1または、次のものを使用できますset -e

pids=(1025 3425 6474)
(
    for pid in "${pids[@]}"; do
        check "$pid" || exit 1
    done
)
echo $?

答え3

おそらく:

parallel -j0 check ::: $pid1 $pid2 $pidN &&
  echo all succeeded
parallel -j0  '! check' ::: $pid1 $pid2 $pidN &&
  echo all failed
parallel -j0 --halt soon,success=1 check ::: $pid1 $pid2 $pidN &&
  echo one succeeded
parallel -j0 --halt soon,fail=1 check ::: $pid1 $pid2 $pidN ||
  echo one failed

検査を並列に実行します。結果がわかったらすぐに実行中のスキャンを終了するには、soonに置き換えます。now

パイプの出力にPIDがある場合(1行に1つ):

pid_generator | parallel -j0 check && echo all succeeded

parallel値を与え、checkできるだけ多くの値を並列に実行します()。check-j0

まだサーバーをインストールしていない場合は、parallel次の機能を備えたコンピューターで実行してください。持つ parallel取付ける:

parallel --embed > new_script

(最後の5行)を編集しnew_scriptてスクリプトをサーバーにコピーします。

答え4

単純な関数は各引数をテストできます。失敗した場合、関数はゼロ以外のコードを返します。

#!/bin/sh

testall() {
  for test
  do
    sh -c "$test" || return 1
  done
}

いくつかの例をテストしました。

$ testall "echo 1" "echo 2" "false" && echo all OK
1
2
$ testall "echo 1" "echo 2" "echo 3" && echo all OK
1
2
3
all OK
$ testall && echo all OK
all OK

関連情報