2つの条件を使用するbashで動作する単純なwhileループを取得しようとしていますが、さまざまなフォーラムからさまざまな構文を試した後、エラーをスローするのを止めることはできません。ここに私が持っているものがあります:
while [ $stats -gt 300 ] -o [ $stats -eq 0 ]
私も試しました:
while [[ $stats -gt 300 ] || [ $stats -eq 0 ]]
...他のいくつかの構成要素と同様に。 $stats is > 300
の間、または$stats = 0
の場合、このループを続行します。
正しいオプションは次のとおりです(推奨の昇順)。
# 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 ))
いくつかのメモ:
[[ ... ]]
および((...))
内のパラメーター展開の引用はオプションです。変数が設定されていない場合、-gt
および-eq
は値0を想定します。
$
の使用は(( ... ))
内ではオプションですが、これを使用すると、意図しないエラーを回避できます。 stats
が設定されていない場合、(( stats > 300 ))
はstats == 0
と見なされますが、(( $stats > 300 ))
は構文エラーを生成します。
試してください:
while [ $stats -gt 300 -o $stats -eq 0 ]
[
はtest
の呼び出しです。他の言語の括弧のように、グループ化するためだけのものではありません。詳細については、man [
またはman test
を確認してください。
2番目の構文の外側にある余分な[]は不要であり、混乱を招く可能性があります。それらを使用できますが、必要な場合は、それらの間に空白を入れる必要があります。
代わりに:
while [ $stats -gt 300 ] || [ $stats -eq 0 ]