Использование "и" в Bash while loop

Хорошо, по сути это то, как выглядит скрипт:

echo -n "Guess my number: "
read guess

while [ $guess != 5 ]; do
echo Your answer is $guess. This is incorrect. Please try again.
echo -n "What is your guess? "
read guess
done

echo "That correct! The answer was $guess!"

То, что я хочу изменить, это строка:

while [ $guess != 5 ]; do

Чтобы что-то вроде этого:

while [ $guess != 5 and $guess != 10 ]; do

В Java я знаю, "и" - это "&&", но здесь это не работает. Собираюсь ли я сделать это правильно, используя цикл while?

Ответы

Ответ 1

Оператор [] в bash является синтаксическим сахаром для вызова test, который документирован в man test. "или" выражается инфисом -o, но вам нужно "и":

while [ $guess != 5 -a $guess != 10 ]; do

Ответ 2

Есть два правильных и портативных способа достижения желаемого. Хороший старый синтаксис shell:

while [ "$guess" != 5 ] && [ "$guess" != 10 ]; do

И bash синтаксис (как вы указываете):

while [[ "$guess" != 5 && "$guess" != 10 ]]; do

Ответ 3

Портативный и надежный способ заключается в использовании инструкции case. Если вы не привыкли к этому, может потребоваться несколько взглядов, чтобы обернуть вокруг синтаксиса.

while true; do
    case $guess in 5 | 10) break ;; esac
    echo Your answer is $guess. This is incorrect. Please try again.
    echo -n "What is your guess? "
    read guess  # not $guess
done

Я использовал while true, но вы действительно могли использовать оператор case там напрямую. Тем не менее, он становится волосатым, чтобы читать и поддерживать.

while case $guess in 5 | 10) false;; *) true;; esac; do ...