Скрипт Bash, который требует ответа “да” на несколько запросов перед выполнением команды(о)

Вопрос или проблема

Я пытаюсь создать bash-скрипт, который задает серию вопросов, заданных последовательно, на которые нужно ответить словом “да”, прежде чем перейти к следующему вопросу. После последнего вопроса запрашивается кусок данных, который читается в переменную перед выполнением двух финальных команд.

Скрипт достаточно сложный, поэтому мои начальные навыки bash и немного интернет-исследований пока не привели к решению. Поэтому я хочу попросить о помощи.

Ниже приведен образец временного скрипта, содержащего немного псевдокода, смешанного с действительными командами, который должен лучше донести, что я пытаюсь сделать с этим скриптом.

#!/bin/sh
echo "Этот скрипт создаст для вас файл и, возможно, переименует его. Нажмите любую клавишу, чтобы продолжить." read anykey
логика здесь для ожидания, пока не будет нажата клавиша, затем переходите к отображению первого вопроса

echo "Хотите ли вы создать файл?" read ans1
if [ $ans1 == да ]; then 
echo "Переходим к следующему вопросу." #Логика здесь для перехода к следующему 
вопросу
if [ $ans1 != да ] echo "Этот вопрос требует ответа 'да'. Возврат к вопросу"
else логика здесь для повторного вопроса
fi

echo "Хотите ли вы действительно создать файл?" read ans2
if [ $ans2 == да ]; then 
echo "Переходим к следующему вопросу." #Логика здесь для перехода к следующему вопросу
if [ $ans2 != да ] echo "Этот вопрос требует ответа 'да'. Возврат к вопросу"
else логика здесь для повторного вопроса
fi

echo "Вы абсолютно уверены, что хотите создать файл?" read ans3
if [ $ans3 == да ]; then 
echo "Переходим к следующему вопросу." #Логика здесь для перехода к следующему вопросу
if [ $ans3 != да ] echo "Этот вопрос требует ответа 'да'. Возврат к вопросу"
else логика здесь для повторного вопроса
fi

echo "Вы серьезно относитесь к обязанностям по созданию этого файла?" read ans4
if [ $ans4 == да ]; then 
echo "Переходим к следующему вопросу." #Логика здесь для перехода к следующему вопросу
if [ $ans4 != да ] echo "Этот вопрос требует ответа 'да'. Возврат к вопросу"
else логика здесь для повторного вопроса
fi

echo "Вы твердо обязуетесь не удалять этот файл легкомысленно?" read ans5
if [ $ans5 == да ]; then 
echo "Переходим к следующему пункту." #Логика здесь для перехода к следующему пункту
if [ $ans5 != да ] echo "Этот вопрос требует ответа 'да'. Возврат к вопросу"
else логика здесь для повторного вопроса
fi

echo "Хорошо, если вы настаиваете на этом, пожалуйста, введите имя файла:" read filename

echo "Создание файла $filename"

touch $filename

echo "Ваш выбор имен файлов считается недостаточным. Переименование файла."

mv $filename adequate-filename

echo "Поздравляю, вы успешно создали файл. Выход"

done

Я не могу определить, могут ли, например, циклы while или until быть применимы здесь. Любая информация по этой задаче будет оценена. Спасибо

ПОЗЖЕ РЕДАКЦИЯ: Вот что я придумал, используя функцию (как предложил Маркус) — много благодарности ИИ:

#!/bin/bash 
read -n1 -s -r -p "Этот скрипт создаст для вас файл и, возможно, переименует его. Нажмите любую клавишу, чтобы продолжить."
echo
echo
# Функция для вопросов только с "да" 
ask_question() 
{ 
    while true; 
    do 
        read -p "$1 (только да): " answer 
        if [[ "$answer" == "да" ]]; then break 
        else 
            echo "Пожалуйста, ответьте да." 
        fi 
    done 
} 
# Задайте 5 вопросов только с "да" 
ask_question "Хотите ли вы создать файл?" 
ask_question "Хотите ли вы действительно создать файл?" 
ask_question "Вы абсолютно уверены, что хотите создать файл?" 
ask_question "Вы серьезно относитесь к обязанностям по созданию этого файла?" 
ask_question "Вы твердо обязуетесь не удалять этот файл легкомысленно?" 
echo
read -p "Хорошо, если вы настаиваете на этом, пожалуйста, введите имя файла: " filename
sleep 1 && touch $filename
sleep 2
echo "Ваш выбор имен файлов считается недостаточным. Переименование файла."
mv $filename $(date +%m-%d-%y)-$filename
echo "Поздравляю, вы успешно создали файл."
# Финальный вопрос 
read -p "Вы готовы выйти? (да/нет): " ready_answer 
# Проверка, готов ли пользователь 
if [[ "$ready_answer" == "да" ]]; then 
    echo "Ваш новый файл сохранен как $(ls $(date +%m-%d-%y)-$filename)"
else 
    echo "Вы не готовы." 
fi

Нужны ли какие-либо улучшения/исправления? Это цикл while, работающий внутри функции, верно?

Ответ или решение

Ответ на вопрос о создании Bash-скрипта, требующего последовательного ответа «да»

В данном случае ваша задача заключается в создании Bash-скрипта, который запрашивает у пользователя несколько вопросов и требует последовательных ответов «да» для продолжения выполнения. Рассмотрим, как можно эффективно реализовать такую логику, используя функции и циклы в Bash.

Шаги для создания скрипта

  1. Запрос подтверждения перед началом: перед началом выполнения скрипта можно добавить подтверждение от пользователя.
  2. Определение функции для вопросов: создайте функцию, которая будет задавать вопросы и проверять ответы.
  3. Запрос имени файла от пользователя: после успешного получения ответов необходимо запросить имя файла.
  4. Создание и переименование файла: выполнить команды для создания файла и его переименования.

Пример реализации

Ниже приведён оптимизированный вариант вашего скрипта, который использует преимущества функций и циклов:

#!/bin/bash 

# Функция для ожидания нажатия клавиши
wait_for_key() {
    read -n1 -s -r -p "Этот скрипт создаст файл для вас и, возможно, переименует его. Нажмите любую клавишу для продолжения."
    echo
}

# Функция для последовательного задания вопросов
ask_question() { 
    while true; do 
        read -p "$1 (только 'да'): " answer 
        if [[ "$answer" == "да" ]]; then 
            break 
        else 
            echo "Пожалуйста, ответьте 'да'." 
        fi 
    done 
}

# Начало выполнения скрипта
wait_for_key

# Задаем вопросы
ask_question "Вы хотите создать файл?"
ask_question "Вы действительно хотите создать файл?"
ask_question "Вы абсолютно уверены, что хотите создать файл?"
ask_question "Вы серьёзно относитесь к ответственности за создание этого файла?"
ask_question "Вы твердо намерены не удалять этот файл без необходимости?"

# Запрашиваем имя файла
echo
read -p "Хорошо, если вы настаиваете, введите имя файла: " filename

# Создание файла
touch "$filename"
echo "Файл $filename успешно создан."

# Переименование файла в стандартное наименование
new_filename="$(date +%Y%m%d)-$filename"
mv "$filename" "$new_filename"
echo "Ваш файл был переименован в $new_filename."

# Заключительное сообщение
echo "Поздравляем, вы успешно создали файл."

# Запрашиваем готовность к выходу
read -p "Вы готовы выйти? (да/нет): " ready_answer 
if [[ "$ready_answer" == "да" ]]; then 
    echo "Ваш новый файл сохранен как $new_filename."
else 
    echo "Вы не готовы выйти." 
fi

Примечания к реализации

  • Функция wait_for_key: используется для ожидания нажатия любой клавиши, что обеспечивает удобство пользовательского интерфейса.
  • Функция ask_question: реализует цикл, который будет повторяться до тех пор, пока пользователь не ответит «да». Это позволяет значительно сократить количество повторяющегося кода и централизовать логику проверки ответов.
  • Динамическое переименование файла: у вас теперь есть автоматическое форматирование даты при переименовании файла, что делает его более организованным.

Заключение

Используя такие подходы, вы сможете создать удобный и понятный Bash-скрипт, который будет взаимодействовать с пользователем последовательно и интуитивно. Следуя приведённым рекомендациям, вы можете улучшить восприятие скрипта и сделать его более устойчивым к ошибкам пользователя.

Оцените материал
Добавить комментарий

Капча загружается...