Интерактивные запросы да/нет в Bash

Всё о запросах да/нет в Bash: от простого read до yes, expect и графических диалогов. Автоматизируй скрипты легко и стильно!

Интерактивные запросы «да/нет» – одна из самых распространённых задач при написании bash‑скриптов. Иногда нужно спросить у пользователя подтверждение операции, иногда требуется полностью автоматизировать ввод без участия человека. В этой статье мы разберём все способы реализации запроса да/нет в Bash, от простейшего read до использования yes, expect и графических диалогов.


Содержание

  1. Базовый запрос с read
  2. Обработка ответа через case
  3. Ответ по умолчанию (Y/n, y/N)
  4. Автоматический ответ с помощью yes
  5. Автоматизация интерактивных программ через expect
  6. Графические и текстовые диалоги (dialog, zenity)
  7. Скрипты без интерактивного ввода (CI/CD)
  8. Лучшие практики и подводные камни

Базовый запрос с 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 г.