一連のテスト(それぞれ異なる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
。
しかし、変数などを単一の配列に置き換えましたPID1
。PID2
Bashは名前が特定の文字列で始まる変数を繰り返すことができますが、配列はより便利です。 (これらの変数が正しい配列を渡すことができない環境を介してスクリプトの外部から来る場合は除外されます。)
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