以下のように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」よりも説明的な変数名を使用することもできます。)
答え2
シェルの論理演算子は&&
と です||
。そして&
実際に|
非常に他のもの(バックグラウンドジョブの開始と2つのプロセス間のパイプの設定)
#!/bin/sh
number1=1
while [ "$number1" -le 12 ]; do
number2=$( some command )
case $number2 in
200)
break
;;
""|404)
# nothing
;;
*)
printf 'Unexpected: number2 = %s\n' "$number2" >&2
exit 1
esac
number1=$(( number1 + 1 ))
done
の数字はHTTPステータスコードのように見えます。上記のステートメントの値をテストすると、$number2
シェルコードを扱いにくいステートメントにすることなく複数のステータスコードが与えられたら、正しいアクションを選択できます。例えば、case
if
どのこのモードでは、クライアントまたはサーバーのエラーコードがトリガーされることがあります4??|5??
。
これはまた、2つの変数の意味を論理的に分離する。このnumber1
変数は、繰り返し回数を制御するときに、number2
不思議なコマンドの結果に基づいて実行される操作を厳密に制御します。