Интерактивные запросы «да/нет» – одна из самых распространённых задач при написании bash‑скриптов. Иногда нужно спросить у пользователя подтверждение операции, иногда требуется полностью автоматизировать ввод без участия человека. В этой статье мы разберём все способы реализации запроса да/нет в Bash, от простейшего read до использования yes, expect и графических диалогов.
Содержание
- Базовый запрос с
read - Обработка ответа через
case - Ответ по умолчанию (Y/n, y/N)
- Автоматический ответ с помощью
yes - Автоматизация интерактивных программ через
expect - Графические и текстовые диалоги (
dialog,zenity) - Скрипты без интерактивного ввода (CI/CD)
- Лучшие практики и подводные камни
Базовый запрос с read
Самый простой способ спросить пользователя – использовать встроенную команду read. Ниже несколько вариантов.
Пример 1. Обычный запрос
#!/bin/bash
read -p "Продолжить? (y/n) " answer
if $answer == "y" ; then
echo "Продолжаем..."
else
echo "Прерываем."
fi
Параметр -p выводит приглашение без перехода на новую строку.
Пример 2. Считывание только одного символа
read -n1 -p "Удалить файл? (y/n) " answer
echo # перевод строки после ввода
if [[ $answer =~ ^[Yy]$ ]]; then
rm -f "$file"
fi
Опция -n1 заставляет read принять ровно один символ и сразу продолжить работу скрипта.
Пример 3. С включённым редактированием строки
read -e -p "Введите имя пользователя: " user
echo "Вы ввели: $user"
Опция -e позволяет использовать возможности readline (стрелки, история и т.д.).
Обработка ответа через case
Для более гибкой обработки ввода удобно использовать оператор case. Он позволяет отлавливать несколько вариантов (y, yes, Y, YES и т.д.).
#!/bin/bash
read -p "Перезапустить сервис? (y/n) " ans
case "$ans" in
[Yy]|[Yy][Ee][Ss])
echo "Сервис будет перезапущен."
systemctl restart myservice
;;
[Nn]|[Nn][Oo])
echo "Операция отменена."
;;
*)
echo "Неправильный ввод. Пожалуйста, введите y или n."
exit 1
;;esac
Шаблоны [Yy] и [Yy][Ee][Ss] позволяют принимать как одну букву, так и полное слово «yes» в любом регистре.
Ответ по умолчанию (Y/n, y/N)
Часто пользователю предлагается нажать Enter для выбора «по умолчанию». Реализовать это можно так:
#!/bin/bash
while true; do
read -p "Удалить все файлы? [y/N] " ans
ans=${ans:-N} # если ввода нет – берём N
case "$ans" in
[Yy]* ) echo "Удаляю..."; break;;
[Nn]* ) echo "Отмена."; break;;
- ) echo "Пожалуйста, введите y или n.";;
esac
done
Строка ans=${ans:-N} задаёт значение по умолчанию, если пользователь просто нажал Enter.
Автоматический ответ с помощью yes
Если скрипт должен работать без участия человека (например, в CI), удобно использовать утилиту yes, которая бесконечно выводит указанную строку.
Пример 5. Принудительно отвечаем «yes»
# Пример: автоматическое подтверждение установки пакетов
yes | sudo apt-get install some-package
Если программа ожидает «y» вместо «yes», указываем нужный символ:
yes y | some-interactive-cmd
Для отказа от подтверждения используем yes n или соответствующий флаг программы (--assume-no, -y и т.п.).
Автоматизация интерактивных программ через expect
Утилита expect позволяет управлять любой программой, ожидающей ввод. Это особенно полезно, когда команда задаёт несколько вопросов.
Пример 6. Скрипт expect для ssh
#!/usr/bin/expect -f
set timeout -1
spawn ssh user@host
expect "password:"
send "MySecretPassword
"
expect "$ "
send "sudo reboot
"
expect "password for user:"
send "MySecretPassword
"
expect eof
В Bash‑скрипте можно вызвать expect так:
expect <<EOF
spawn apt-get install mypkg
expect "Do you want to continue? [Y/n]"
send "Y
"
expect eof
EOF
Не забывайте, что хранить пароли в открытом виде небезопасно – лучше использовать ssh-agent, sudo -S с вводом из переменной окружения или специальные менеджеры секретов.
Графические и текстовые диалоги (dialog, zenity)
Для более удобного пользовательского опыта можно вызвать диалоговое окно.
Текстовый диалог dialog
#!/bin/bash
if dialog --yesno "Удалить все файлы?" 10 40; then
echo "Файлы удалены."
else
echo "Отмена."
fi
Команда возвращает код 0 при выборе «Yes» и 1 при «No», что удобно проверять в if.
Графический диалог zenity
#!/bin/bash
if zenity --question --text="Перезапустить сеть?"; then
systemctl restart networking
else
echo "Операция отменена."
fi
Эти утилиты работают только в графической среде, поэтому в серверных скриптах их обычно не используют.
Скрипты без интерактивного ввода (CI/CD)
В системах непрерывной интеграции (GitLab CI, GitHub Actions, Jenkins) любой запрос ввода приводит к зависанию пайплайна. Поэтому:
- Всегда задавайте флаги
-y,--yesили--assume-yesу пакетов. - Если скрипт написан вами, добавляйте параметр
--non-interactive(или аналог) и в коде проверяйте переменнуюCIилиINTERACTIVE=0. - Для тестов используйте
yesили передавайте ответы черезprintf:
# Пример: передаём несколько ответов
printf "y
n
y
" | ./my-interactive-script.sh
Лучшие практики и подводные камни
- Не используйте
readбез проверки. Пользователь может ввести пробелы, пустую строку или любые символы. Приводите ввод к нижнему регистру${ans,,}и проверяйте черезcase. - Не полагайтесь только на
yesв продакшене. Лучше добавить в скрипт параметр--forceи явно проверять его. - Обрабатывайте сигналы. При запросе
readпользователь может нажатьCtrl+C. Добавьте обработчикtrapдля корректного завершения. - Поддержка локализации. В разных языках ответы могут быть
да/нет,oui/nonи т.д. Если ваш скрипт будет использоваться в международных проектах, проверяйте варианты или используйте переменнуюLANG. - Тестируемость. Для unit‑тестов скриптов оборачивайте запросы в функцию, которую можно замокать:
ask_yes_no {
local prompt=$1 default=$2
read -p "$prompt " ans
ans=${ans:-$default}
[[ $ans =~ ^[Yy]$ ]]
}
ask_yes_no { return 0; } # всегда «yes»
source script.sh
Запрос «да/нет» – простая, но важная часть любого интерактивного bash‑скрипта. Мы рассмотрели:
- Базовый ввод через
readи его опции; - Обработку вариантов с помощью
case; - Ответы по умолчанию и бесконечные циклы;
- Автоматизацию с
yesиexpect; - Графические и текстовые диалоги (
dialog,zenity); - Практики для CI/CD и советы по надёжности кода.
Выбирайте подходящий метод в зависимости от окружения (сервер, рабочий стол, CI) и требований к безопасности. Помните, что правильная обработка пользовательского ввода повышает надёжность и удобство ваших скриптов.
Дата публикации: 13 мая 2026 г.