Подтвердить что ты не робот

Bash скрипты, множество условий в цикле while

Я пытаюсь получить простой цикл while, работающий в bash, который использует два условия, но после того, как вы попробовали много разных синтаксисов с разных форумов, я не могу прекратить бросать ошибку. Вот что я имею:

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

Я также пробовал:

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

... а также несколько других конструкций. Я хочу, чтобы этот цикл продолжался, пока $stats is > 300 или if $stats = 0.

4b9b3361

Ответ 1

Правильные варианты (в порядке возрастания рекомендации):

# 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 )) приведет к синтаксической ошибке.

Ответ 2

Try:

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

[ - вызов test. Это не только для группировки, как круглые скобки на других языках. Проверьте man [ или man test для получения дополнительной информации.

Ответ 3

Дополнительные [] на внешнем уровне вашего второго синтаксиса не нужны и, возможно, запутывают. Вы можете использовать их, но если вам нужно иметь пробелы между ними.

В качестве альтернативы:

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