複数の条件を持つ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」よりも説明的な変数名を使用することもできます。)

答え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シェルコードを扱いにくいステートメントにすることなく複数のステータスコードが与えられたら、正しいアクションを選択できます。例えば、caseifどのこのモードでは、クライアントまたはサーバーのエラーコードがトリガーされることがあります4??|5??

これはまた、2つの変数の意味を論理的に分離する。このnumber1変数は、繰り返し回数を制御するときに、number2不思議なコマンドの結果に基づいて実行される操作を厳密に制御します。

関連情報