以下のように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つの条件を削除することをお勧めします。number2
null または 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」よりも説明的な変数名を使用することもできます。)