Bash-скриптинг: Как в интерактивном режиме запросить у пользователя подтверждение на изменение режима с предустановленным дефолтным значением?

В Bash-скриптинге часто требуется спросить пользователя, хочет ли он продолжить какое-либо действие — например, изменить режим работы программы. При этом удобно задать дефолтное значение, которое применяется, если пользователь просто нажимает Enter без ввода.

## Базовый подход с командой `read`

Команда `read` с флагом `-p` позволяет вывести приглашение и считать ввод. Флаг `-r` предотвращает интерпретацию обратного слеша:

bash
#!/bin/bash

read -r -p «Изменить режим? [Y/n]: » response

# Приводим к нижнему регистру
response=${response,,}

# Дефолт — ‘yes’, если пользователь нажал Enter
if [[ -z «$response» || «$response» =~ ^(y|yes)$ ]]; then
echo «Режим изменён.»
else
echo «Отмена. Режим остался прежним.»
fi

Здесь `[Y/n]` в подсказке сигнализирует пользователю, что заглавная `Y` — это дефолт (ответ по умолчанию при нажатии Enter).

## Вариант с дефолтом «нет»

Если дефолтное значение — отказ, используйте `[y/N]`:

bash
read -r -p «Изменить режим? [y/N]: » response
response=${response,,}

if [[ «$response» =~ ^(y|yes)$ ]]; then
echo «Режим изменён.»
else
echo «Отмена.»
fi

## Универсальная функция для повторного использования

Чтобы не дублировать код, вынесите логику в функцию:

bash
confirm() {
local prompt=»${1:-Продолжить?}»
local default=»${2:-Y}» # Y или N

if [[ «$default» == «Y» ]]; then
local hint=»[Y/n]»
else
local hint=»[y/N]»
fi

read -r -p «$prompt $hint: » response
response=${response:-$default}
response=${response,,}

[[ «$response» =~ ^(y|yes)$ ]]
}

# Использование:
if confirm «Изменить режим работы?» «Y»; then
echo «Режим изменён.»
else
echo «Режим не изменён.»
fi

## Ключевые моменты

— `${response:-$default}` — подставляет дефолт, если переменная пуста (пользователь нажал Enter).
— `${response,,}` — приводит строку к нижнему регистру (работает в Bash 4+).
— Флаг `-t` у `read` задаёт таймаут: `read -t 10 -r -p «…»` — автоматически применит дефолт через 10 секунд.
— Флаг `-n 1` позволяет принять одиночный символ без нажатия Enter: `read -n 1 -r -p «…»` — удобно для быстрого подтверждения.

## Пример с таймаутом и дефолтом

bash
read -t 15 -r -p «Изменить режим? [Y/n] (авто через 15 сек): » response || true
response=${response:-Y}
response=${response,,}

if [[ «$response» =~ ^(y|yes)$ ]]; then
echo «Режим изменён.»
fi

Такой подход делает скрипты удобными, безопасными и понятными для пользователя.


Задайте вопрос нейросети

Не нашли ответ? Спросите ИИ — он подготовит развёрнутую статью.