複数の条件を持つwhileループを実際の条件で停止するには?

複数の条件を持つwhileループを実際の条件で停止するには?

以下のようにwhileループを提供しました。

#!/bin/bash
number1=1
while [ -z "$number2" ] | [ "$number2" == 404 ] & [ "$number2" != 200 ] & [ "$number1" -lt 13 ]; do
  #number2=$(some command which can actually get a number)
  number2=200 # <<< e.g. a command that would return 
  let number1=number1+1
done

これは私がすべきことです。

nullの場合はnumber2ループを実行し、404の場合は
ループnumber2を実行し、12に
なるまでループを実行number2しません。
number1

ループを試してもnumber2=200停止しません。どこで止まるのかを確認するのがnumber2難しいようです200

number2=200回避策が使用可能になったときにwhileループが停止するように、このステートメントをどのように作成できますか?

ベストアンサー1

number2がnullの場合はループを実行し、number2が200の場合
はループを実行します。 number1が12になるまでループを実行
しません。

つまり、繰り返すだけです(number2 is null OR number2 = 404) AND (number2 != 200) AND (number1 <= 12)。ここでは、ANDとORの優先順位を明確にするために一種のグループ化が必要です。 (Bashでは左から右に動作します&&が、||AND演算子は通常OR演算子よりもバインドされます。)

他の値に何が起こるのか言及していませんが、number2最初の2つの条件を削除することをお勧めします。number2null または 404 の場合は 200 にできないためです。だから私たちは(number2 != 200) AND (number1 <= 12)

ここでは、

while [ -z "$number2" ] | [ "$number2" == 404 ] & [ "$number2" != 200 ] & [ "$number1" -lt 13 ]; do ...

|そして&代わり||にそしてあります&&。上記のコマンドをバックグラウンドで実行する|パイプラインを表します。&したがって、上記のコードは3つのコマンドを並列に実行します。 1つは2つのテストを含み、もう1つのパイプラインは1つのテストを含み、両方ともバックグラウンドで実行され、1つのテストがフォアグラウンドで実行されます。これはあまり意味がありません。&&上記では、||Bashの論理条件演算子と呼ばれています。

単純化された形式は次のとおりです。

while [ "$number2" != 200 ] && [ "$number1" -le 12 ]; do ...

(「number1」や「number2」よりも説明的な変数名を使用することもできます。)

おすすめ記事