
Нам нужно создать скрипт с одним 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
).