Bash scripting, multiple conditions in while loop

bash, loops, shell, while-loop

Solution

The correct options are (in increasing order of recommendation):

# 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 ))

Some notes:

Quoting the parameter expansions inside `[[ ... ]]` and `((...))` is optional; if the variable is not set, `-gt` and `-eq` will assume a value of 0.

Using `$` is optional inside `(( ... ))`, but using it can help avoid unintentional errors. If `stats` isn't set, then `(( stats > 300 ))` will assume `stats == 0`, but `(( $stats > 300 ))` will produce a syntax error.

Problem

I'm trying to get a simple while loop working in bash that uses two conditions, but after trying many different syntax from various forums, I can't stop throwing an error. Here is what I have: ``` while [ $stats -gt 300 ] -o [ $stats -eq 0 ] ``` I have also tried: ``` while [[ $stats -gt 300 ] || [ $stats -eq 0 ]] ``` ... as well as several others constructs. I want this loop to continue while `$stats is > 300` or if `$stats = 0`.

Original source