Вопрос или проблема
Я пытаюсь создать 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.
Шаги для создания скрипта
- Запрос подтверждения перед началом: перед началом выполнения скрипта можно добавить подтверждение от пользователя.
- Определение функции для вопросов: создайте функцию, которая будет задавать вопросы и проверять ответы.
- Запрос имени файла от пользователя: после успешного получения ответов необходимо запросить имя файла.
- Создание и переименование файла: выполнить команды для создания файла и его переименования.
Пример реализации
Ниже приведён оптимизированный вариант вашего скрипта, который использует преимущества функций и циклов:
#!/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-скрипт, который будет взаимодействовать с пользователем последовательно и интуитивно. Следуя приведённым рекомендациям, вы можете улучшить восприятие скрипта и сделать его более устойчивым к ошибкам пользователя.