Ответ 1
Оператор []
в bash является синтаксическим сахаром для вызова test
, который документирован в man test
. "или" выражается инфисом -o
, но вам нужно "и":
while [ $guess != 5 -a $guess != 10 ]; do
Хорошо, по сути это то, как выглядит скрипт:
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?
Оператор []
в bash является синтаксическим сахаром для вызова test
, который документирован в man test
. "или" выражается инфисом -o
, но вам нужно "и":
while [ $guess != 5 -a $guess != 10 ]; do
Есть два правильных и портативных способа достижения желаемого.
Хороший старый синтаксис shell
:
while [ "$guess" != 5 ] && [ "$guess" != 10 ]; do
И bash
синтаксис (как вы указываете):
while [[ "$guess" != 5 && "$guess" != 10 ]]; do
Портативный и надежный способ заключается в использовании инструкции 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 ...