web-dev-qa-db-ja.com

Bashスクリプト、whileループの複数の条件

2つの条件を使用するbashで動作する単純なwhileループを取得しようとしていますが、さまざまなフォーラムからさまざまな構文を試した後、エラーをスローするのを止めることはできません。ここに私が持っているものがあります:

while [ $stats -gt 300 ] -o [ $stats -eq 0 ]

私も試しました:

while [[ $stats -gt 300 ] || [ $stats -eq 0 ]]

...他のいくつかの構成要素と同様に。 $stats is > 300の間、または$stats = 0の場合、このループを続行します。

45
jake9115

正しいオプションは次のとおりです(推奨の昇順)。

# Single POSIX test command with -o operator (not recommended anymore).
# Quotes strongly recommended to guard against empty or undefined variables.
while [ "$stats" -gt 300 -o "$stats" -eq 0 ]

# Two POSIX test commands joined in a list with ||.
# Quotes strongly recommended to guard against empty or undefined variables.
while [ "$stats" -gt 300 ] || [ "$stats" -eq 0 ]

# Two bash conditional expressions joined in a list with ||.
while [[ $stats -gt 300 ]] || [[ $stats -eq 0 ]]

# A single bash conditional expression with the || operator.
while [[ $stats -gt 300 || $stats -eq 0 ]]

# Two bash arithmetic expressions joined in a list with ||.
# $ optional, as a string can only be interpreted as a variable
while (( stats > 300 )) || (( stats == 0 ))

# And finally, a single bash arithmetic expression with the || operator.
# $ optional, as a string can only be interpreted as a variable
while (( stats > 300 || stats == 0 ))

いくつかのメモ:

  1. [[ ... ]]および((...))内のパラメーター展開の引用はオプションです。変数が設定されていない場合、-gtおよび-eqは値0を想定します。

  2. $の使用は(( ... ))内ではオプションですが、これを使用すると、意図しないエラーを回避できます。 statsが設定されていない場合、(( stats > 300 ))stats == 0と見なされますが、(( $stats > 300 ))は構文エラーを生成します。

105
chepner

試してください:

while [ $stats -gt 300 -o $stats -eq 0 ]

[testの呼び出しです。他の言語の括弧のように、グループ化するためだけのものではありません。詳細については、man [またはman testを確認してください。

1
drewmm

2番目の構文の外側にある余分な[]は不要であり、混乱を招く可能性があります。それらを使用できますが、必要な場合は、それらの間に空白を入れる必要があります。

代わりに:

while [ $stats -gt 300 ] || [ $stats -eq 0 ]
0
Lighthart