Можно ли поместить оператор if в цикл until?

Можно ли поместить оператор if в цикл until?

Нам нужно создать скрипт с одним untilциклом, который будет многократно спрашивать у пользователя число. - Если число не равно 50, вывести сообщение «Неправильное число; попробуйте еще раз». - Попросить другое число. - Если число равно 50, вывести сообщение «Вы поняли!» и остановиться.

Вот что у меня есть на данный момент:

    echo -n "please choose a number: "
    read number
    until [$number -eq 50];
    do
         if [$number !=50]
         then 
               echo "Wrong number; try again" 
               read wrong 
         else 
               echo -n "Please choose a number: "
               read newnum
         fi
    done 

Я не уверен, как зациклить оператор "Пожалуйста, выберите число". Я всегда получаю ошибку:

      syntax error near unexpected token 'fi' 

Я искал в интернете, но там нет четких примеров циклов ввода-вывода UNTIL.

решение1

echo -n "please choose a number: "

read number
until [ $number -eq 50 ]
do
     # if [ $number -ne 50 ]
     # then 
           echo "Wrong number; try again" 
           read number 
     # fi
done 

echo You got it\!

Первый readсчитывает переменную number. untilЦикл повторяется до тех пор, пока $numberне станет равным 50.

Проверка внутри цикла не нужна, так как untilвыполняется только тогда, когда число равно -ne(не равно) 50.

Основная проблема, с которой вы столкнулись, заключалась в том, что readвнутри цикла необходимо было обновить ту же переменную ( number), которую untilпроверяла конструкция.

Пробелы также важны, потому что слово (окруженное пробелами) после него if— это имя команды. [$numberоценивается как то, что было введено, но с префиксом '[', что, скорее всего, не является именем существующей команды. Например, если первой догадкой было 42, ifкоманда попытается выполнить команду [42, вызывая ошибку типа[42: not found.

Также сравнение чисел выполняется с помощью -eq, -lt, -ge, -gt, -ge, -ne.

=и =!предназначены для струнных.

решение2

В другом ответе вы получили более общие советы по вашей программе, поэтому я укажу вам на фактическую ошибку, которая соответствуетif

if [$number !=50]

Должен быть:

if [ $number -ne 50 ]

Я изменил здесь три вещи.

  • Я заменил !=на -ne. Первый недействителен
  • Я добавил пробел между [и $number. (Проверьте, исправив первый шаг, что произойдет, если вы этого не сделаете).

Конечно, вы получите странную программу с неожиданным поведением, но она будет работать :)

решение3

Я бы сделал это так:

#!/usr/bin/env bash

while :; do
    read -p "Please choose a number: " number
    [ "$number" -eq 50 ] 2>/dev/null
    case $? in
        0) break ;;
        1) echo "Wrong number; try again." ;;
        2) echo "Not a valid number; try again." ;;
    esac
done

echo "You got it!"

Где whileможно заменить на until, если хотите. Но у меня такое чувство, что профессор бынетбуду рад, если musicstrings пришлют эту программу. :)

решение4

Твойсинтаксическая ошибка около неожиданного токена «fi»невозможно объяснить с помощью кода, который вы опубликовали, если только за thenи elseне следуют невидимые символы, такие как символ CR (как в случае с файлами из ОС Microsoft, где разделителем строк является CRLF, а не просто LF). Но если бы это был файл в формате DOS, я бы ожидал других сообщений об ошибках из-за CR после doи done.

Редактировать: просматривая историю изменений вашего вопроса, ошибка, похоже, соответствует ошибке впредыдущая версия вашего скрипта.

У вас есть ряд ошибок в [синтаксисе команды, переменные без кавычек, как уже отмечалось, но я хотел бы добавить, что синтаксис цикла untilследующий:

until
  condition-command-list
do
  action-command-list
done

Может condition-command-listбыть любое количество команд, например action-command-list, , поэтому вы можете сделать

until
  printf 'please choose a number: '
  read number || [ -n "$number" ] || exit
  [ "$number" -eq 50 ]
do
  echo >&2 'Wrong number; try again'
done

Часть || exitзаключается в выходе из скрипта по достижении EOF (в противном случае он будет выполняться вечно, если стандартный вывод скрипта был закрыт, как при запуске echo 49 | your-script).

Связанный контент