Форум русскоязычного сообщества Ubuntu


Хотите сделать посильный вклад в развитие Ubuntu и русскоязычного сообщества?
Помогите нам с документацией!

Автор Тема: bash. как зациклить yes/no?  (Прочитано 2904 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн InkVisitor

  • Автор темы
  • Участник
  • *
  • Сообщений: 190
  • Nikopol, Ukraine
    • Просмотр профиля
bash. как зациклить yes/no?
« : 27 Декабря 2009, 00:21:19 »
Как сделать, чтобы при нажатии клавиши, отличной от "y" или "n", процедура выбора повторялась?
Кусок скрипта:
echo "Выберите "Да" или "Нет" (y/n)"
read YESNO
if [ "$YESNO" = "y" ]; then
echo "Выбрано "Да""
else if [ "$YESNO" = "n" ]; then
echo "Выбрано "Нет""
else
echo "Надо было выбрать (y/n)"
echo "Перезапустите скрипт."
fi
fi
Как сделать, чтобы при неудачном выборе єтот кусок перезапускался? 

Оффлайн Protopopulus

  • Старожил
  • *
  • Сообщений: 1695
  • А чего вы так смотрите?..
    • Просмотр профиля
Re: bash. как зациклить yes/no?
« Ответ #1 : 27 Декабря 2009, 00:40:15 »
Примерно так:
function F_CHOICE {

  echo "Выберите Да или Нет"
  read VAR_CHOICE

  case $VAR_CHOICE in
    "y" )
    echo "Выбрано Да";;
    "n" )
    echo "Выбрано Нет";;
    *   )
    F_CHOICE;;
  esac
}
Если ты владеешь знаниями, то и знания владеют тобой. (с) Protopopulus

Оффлайн 3ayp

  • Новичок
  • *
  • Сообщений: 2
    • Просмотр профиля
Re: bash. как зациклить yes/no?
« Ответ #2 : 27 Декабря 2009, 01:17:24 »
Хм. А чем обычный цикл не устраивает? У меня было так:

anser=''
 while [[ 1 ]]; do
    read anser
      case $anser in
        [Yy])
            <Здесь был кусок кода>
          break
        ;;

        [Nn])
            <Здесь был кусок кода>           
          exit 1
        ;;
        *)
          echo -ne "\nТолько Y или N, пожалуйста: "
        ;;
      esac
  done

Цитировать
Автор: Protopopulus
Примерно так:
К рекурсии с ранних лет отношусь настороженно ((:
Uubuntu *.* LTS

Оффлайн InkVisitor

  • Автор темы
  • Участник
  • *
  • Сообщений: 190
  • Nikopol, Ukraine
    • Просмотр профиля
Re: bash. как зациклить yes/no?
« Ответ #3 : 27 Декабря 2009, 01:23:23 »
2Protopopulus - Чё-то вообще не реагирует...
Хоть бы ругнулся терминал... А то молча проглотил, и ничего не показывает...

23ayp - Отлично работает.

Всем спасибо.

Оффлайн Mam(O)n

  • Старожил
  • *
  • Сообщений: 5855
    • Просмотр профиля
Re: bash. как зациклить yes/no?
« Ответ #4 : 27 Декабря 2009, 02:43:08 »
ИМХО, применение функций смотрится более эстетично. Как вариант:

#!/bin/bash
question() {
  while echo -n "$1 [Y/N] " && read answer || true && ! grep -e '^[YyNn]$' <<< $answer > /dev/null; do echo -n "Введите либо N либо Y! "; done
  return $(tr 'YyNn' '0011' <<< $answer)
}

if question "Точняк?"; then
  echo "Ну всё. Погнали."
else
  echo "Ну и зря."
fi

Оффлайн InkVisitor

  • Автор темы
  • Участник
  • *
  • Сообщений: 190
  • Nikopol, Ukraine
    • Просмотр профиля
Re: bash. как зациклить yes/no?
« Ответ #5 : 27 Декабря 2009, 16:23:15 »
В принципе, обе последние функции весьма эстетичны, и работают на ура.
Правда в коде от Mam(O)n-а есть для меня несколько необычного...
Например:
grep -e '^[YyNn]$' <<< $answer > /dev/nullЕсли не трудно, поясните.
Но, в принципе, работает замечательно  :)

Оффлайн Mam(O)n

  • Старожил
  • *
  • Сообщений: 5855
    • Просмотр профиля
Re: bash. как зациклить yes/no?
« Ответ #6 : 27 Декабря 2009, 16:53:15 »
В grep посылается на stdin содержимое $answer. Сам grep проверяет каждую строку в потоке на соответствие регулярному выражению и если соответствует, EXIT_CODE возращает 0, иначе возращает 1. Само регулярное выражение означает, что в строке должен быть один символ из перечисления Y, y, N, n.  Чтобы не мусорить на экране дальнейший вывод stdout направляем в /dev/null. Кстати, только вспомнил, вместо этого можно использовать опцю -q в grep. Т.е. ! grep -qe '^[YyNn]$' <<< $answer. Знак ! означает отрицание EXIT_CODE. Т.е, если grep вернул 1, то отрицание отдаст 0. То есть смысл - если введено не Y, y, N, n, то продолжить цикл.

Оффлайн InkVisitor

  • Автор темы
  • Участник
  • *
  • Сообщений: 190
  • Nikopol, Ukraine
    • Просмотр профиля
Re: bash. как зациклить yes/no?
« Ответ #7 : 27 Декабря 2009, 21:43:27 »
Спасибо.

 

Страница сгенерирована за 0.018 секунд. Запросов: 22.