Привет, ЛОР!
Обучаясь bash велосипедю такое нечто. И вот в case 3 у меня цикл, который ждёт подходящий $ANSWER.
Если отрабатывается case 1 и case 2 то всё корректно - или заново проигрывается скрипт или выход из него.
А в случае case 3 получается, что при выходе из цикла и выходе из case скрипт попадает в старший цикл и поскольку переменная $TIME_LAST пустая, то срабатывает условие и ожидается ввод от пользователя.
Данное поведение подходит, если пользователь хочет повторно завести таймер и не подходит, если он хочет закончить работу.
Т.е. если пользователь ответил Y или ответил N, то всё ок. А если он ответил «qwerty», его переспросили, он ответил N, то всё равно скрипт будет продолжать работу.
Как это организовать по-человечески?
#!/bin/bash
# timer.sh
# Таймер с интерактивным вводом.
# Умеет звенеть колокольчиком на старых терминалах.
# На некоторых современных может посылать уведомления
TIME_LAST="$1" # Время таймера
FLAG=TRUE # Флажок
INTEGER=^[0-9]+$ # Шаблон проверки числа. В данном случае целое положительное число, не строка
while [[ "$FLAG" = "TRUE" ]]; do
if [[ -z "$TIME_LAST" ]]; then
echo -e "\nИспользование: \"`basename $0` время_в_минутах\" или введите в интерактивном режиме"
echo -e "Введите время в минутах (для отмены нажмите Ctrl+C)\n"
read TIME_LAST
until [[ "$TIME_LAST" =~ $INTEGER ]]; do
echo -e "\nОшибка ввода. \"$TIME_LAST\" не является целым положительным числом.\nПовторите ввод\n"
read TIME_LAST
done
echo -e "\nОтсчёт $TIME_LAST мин. пошёл!"
fi
sleep $(( $TIME_LAST * 1 )) && echo -e "\nВремя вышло!\a" # ДЛЯ ТЕСТА ТУТ УКАЗАНО УМНОЖЕНИЕ МИНУТ НА 5, А НАДО НА 60!!!
TIME_LAST="" # Подметаем за собой
echo -e "\nХотите завести новый таймер? y / n\n"
read ANSWER
case "$ANSWER" in
#1 case
"Y" | "y" )
;;
#2 case
"N" | "n" )
FLAG=FALSE # Переключается флажок и выход из цикла
;;
#3 case
* )
echo -e "\nВведите \"y\" или \"n\"\n"
# Пока не будет получен нужный ответ переспрашивать
until [ "$ANSWER" = "y" -o "$ANSWER" = "Y" -o "$ANSWER" = "n" -o "$ANSWER" = "N" ]; do
read ANSWER
done
;;
esac
done
echo -e "\nBye-bye"
exit 0