19

Как запросить ввод Yes/No/Cancel в скрипте оболочки Linux?

11

Я хочу приостановить ввод в скрипте оболочки и запросить у пользователя выбор. Мне нужно задать стандартный вопрос с вариантами «Да», «Нет» или «Отмена». Как мне это сделать в типичном bash-скрипте?

5 ответ(ов)

3

Конечно! Ваша команда Bash на самом деле запрашивает ввод у пользователя и затем выводит введенное значение. Вот перевод на русский в стиле ответа на StackOverflow:

echo "Пожалуйста, введите данные: "
read input_variable
echo "Вы ввели: $input_variable"

Этот код работает следующим образом:

  1. Первая строка выводит сообщение с просьбой ввести данные.
  2. Вторая строка использует команду read для считывания пользовательского ввода и хранения его в переменной input_variable.
  3. Последняя строка выводит введенное пользователем значение.

Если у вас есть дополнительные вопросы или нужна помощь, не стесняйтесь спрашивать!

0

Этот скрипт на Bash читает ввод пользователя с вопросом "Ты в порядке? (y/n)". Если пользователь вводит 'y', выводится сообщение "Рад это слышать". В противном случае выводится сообщение "Вам нужно больше программирования на Bash".

Пример работы скрипта:

read -p "Ты в порядке? (y/n) " RESP
if [ "$RESP" = "y" ]; then
  echo "Рад это слышать"
else
  echo "Вам нужно больше программирования на Bash"
fi

Таким образом, вы можете использовать этот код для простого опроса, чтобы получить ответ от пользователя и отреагировать в зависимости от его выбора.

0

Вы можете использовать следующий код для реализации функции, которая запрашивает у пользователя подтверждение с ответами "y/n".

inquire ()  {
  echo  -n "$1 [y/n]? "
  read answer
  finish="-1"
  while [ "$finish" = '-1' ]
  do
    finish="1"
    if [ "$answer" = '' ];
    then
      answer=""
    else
      case $answer in
        y | Y | yes | YES ) answer="y";;
        n | N | no | NO ) answer="n";;
        *) finish="-1";
           echo -n 'Недопустимый ответ — пожалуйста, введите заново:';
           read answer;;
       esac
    fi
  done
}

... другие части кода

inquire "Установить сейчас?"

...

В этой функции inquire выводится сообщение с вопросом и ожидается ввод ответа от пользователя. В зависимости от введённого ответа, программа будет продолжать запрашивать подтверждение, пока не будет получен корректный ввод ("y" или "n"). Если введён неправильный ответ, выводится сообщение об ошибке, и пользователь снова запрашивается.

0

Вот пример скрипта, который я собрал:

#!/bin/sh

promptyn () {
    while true; do
        read -p "$1 " yn
        case $yn in
            [Yy]* ) return 0;;
            [Nn]* ) return 1;;
            * ) echo "Пожалуйста, ответьте 'да' или 'нет'.";;
        esac
    done
}

if promptyn "Является ли небо синим?"; then
    echo "да"
else
    echo "нет"
fi

Я новичок в этом, так что воспринимайте с осторожностью, но, похоже, это работает.

0

Конечно! Вот перевод на русский язык в формате ответа на StackOverflow:

Вы хотите:

  • Использовать встроенные команды Bash (т.е. портативные)
  • Проверить, является ли терминал TTY
  • Установить ответ по умолчанию
  • Добавить таймаут
  • Задать вопрос с цветом

Пример кода

do_xxxx=y                      # В пакетном режиме => По умолчанию Да
[[ -t 0 ]] &&                  # Если TTY => Запросить вопрос
read -n 1 -p $'\e[1;32m
Do xxxx? (Y/n)\e[0m ' do_xxxx  # Сохраняем ответ в $do_xxxx
if [[ $do_xxxx =~ ^(y|Y|)$ ]]  # Выполняем, если 'y' или 'Y' или пусто
then
    xxxx
fi

Объяснения

  • [[ -t 0 ]] && read ... ⇒ Вызывается команда read, если это TTY
  • read -n 1 ⇒ Ожидание одного символа
  • $'\e[1;32m ... \e[0m ' ⇒ Печать текста зеленым цветом

(зеленый цвет хорошо читается как на белом, так и на черном фоне)

  • [[ $do_xxxx =~ ^(y|Y|)$ ]] ⇒ Регулярное выражение Bash

Таймаут ⇒ Ответ по умолчанию — Нет

do_xxxx=y
[[ -t 0 ]] && {                   # Таймаут 5 секунд (read -t 5)
read -t 5 -n 1 -p $'\e[1;32m
Do xxxx? (Y/n)\e[0m ' do_xxxx ||  # read 'неудачен' при таймауте
do_xxxx=n ; }                     # Таймаут => ответ Нет
if [[ $do_xxxx =~ ^(y|Y|)$ ]]
then
    xxxx
fi

Этот код позволяет задать вопрос пользователю и обработать его ответ, используя встроенные функции Bash и некоторую логическую обработку. Таймаут на ответ на вопрос позволяет установить значение по умолчанию (в данном случае "Нет"), если пользователь не реагирует.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь