2013-03-20 92 views
35

私は単純なwhileループを2つの条件を使用するbashで動作させようとしていますが、さまざまなフォーラムからさまざまな構文を試した後、エラーを投げるのを止めることはできません。ここで私が持っているものです。Bashスクリプティング、whileループの複数の条件

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

私も試してみました:

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

...だけでなく、他のいくつかの構造。 $stats is > 300または$stats = 0の場合、このループを続行します。

答えて

81

正しいオプションは、(推薦の増加順で)次のとおり

# 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))は構文エラーを生成します。

+0

素晴らしい答え、驚くほど徹底的 – jake9115

+0

ブラボー。ポストに答える古典的な方法。よくやった。私は 'until'と同じ構文を使うことができると仮定しています、はい? – SaxDaddy

+0

@SaxDaddy条件を正しく否定するように注意する限り、多かれ少なかれ: '[foo -o bar]'は 'untilまで! [foo -o bar] '、しかし' while foo ||バーは 'までになる! foo &&!バー。 – chepner

1

試してみてください。

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

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

+1

私は '[[' over '['を推奨します。他の答えに私のコメントを参照してください。 – danfuzz

+0

それは公正です。私はOPを使っていたので、[]を使いました。私は両方とも成功に使用されて見たことがあります。 – drewmm

0

2番目の構文の外側にある余分な[]は不要で、おそらく混乱します。あなたはそれらを使うかもしれませんが、必要ならばそれらの間に空白を入れる必要があります。

あるいは:

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

実際には、[[['は一般にテスト式を導入するためには組み込みの方が優先されます。これは古い単一の '['構文よりもいくつかの利点があります。 – danfuzz