Как запросить ввод Yes/No/Cancel в скрипте оболочки Linux?
Я хочу приостановить ввод в скрипте оболочки и запросить у пользователя выбор. Мне нужно задать стандартный вопрос с вариантами «Да», «Нет» или «Отмена». Как мне это сделать в типичном bash-скрипте?
5 ответ(ов)
Конечно! Ваша команда Bash на самом деле запрашивает ввод у пользователя и затем выводит введенное значение. Вот перевод на русский в стиле ответа на StackOverflow:
echo "Пожалуйста, введите данные: "
read input_variable
echo "Вы ввели: $input_variable"
Этот код работает следующим образом:
- Первая строка выводит сообщение с просьбой ввести данные.
- Вторая строка использует команду
read
для считывания пользовательского ввода и хранения его в переменнойinput_variable
. - Последняя строка выводит введенное пользователем значение.
Если у вас есть дополнительные вопросы или нужна помощь, не стесняйтесь спрашивать!
Этот скрипт на Bash читает ввод пользователя с вопросом "Ты в порядке? (y/n)". Если пользователь вводит 'y', выводится сообщение "Рад это слышать". В противном случае выводится сообщение "Вам нужно больше программирования на Bash".
Пример работы скрипта:
read -p "Ты в порядке? (y/n) " RESP
if [ "$RESP" = "y" ]; then
echo "Рад это слышать"
else
echo "Вам нужно больше программирования на Bash"
fi
Таким образом, вы можете использовать этот код для простого опроса, чтобы получить ответ от пользователя и отреагировать в зависимости от его выбора.
Вы можете использовать следующий код для реализации функции, которая запрашивает у пользователя подтверждение с ответами "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"). Если введён неправильный ответ, выводится сообщение об ошибке, и пользователь снова запрашивается.
Вот пример скрипта, который я собрал:
#!/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
Я новичок в этом, так что воспринимайте с осторожностью, но, похоже, это работает.
Конечно! Вот перевод на русский язык в формате ответа на 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
, если это TTYread -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 и некоторую логическую обработку. Таймаут на ответ на вопрос позволяет установить значение по умолчанию (в данном случае "Нет"), если пользователь не реагирует.
Как выводить команды оболочки по мере их выполнения
Как объявить и использовать логические переменные в shell-скрипте?
Как установить переменную на вывод команды в Bash?
Как работает "cat << EOF" в bash?
Как использовать 'grep' для непрерывного потока?