bash меню позволяет реализовать несколько веток сценария выполнения программы в зависимости от ответов пользователя для консольных скриптов.
Скрипт с меню будет выводить вопросы и считывать ответы выполняя на основании этих ответов те или иные действия.
В рамках статьи будет рассмотрено написание на скрипта простого меню с двумя возможными опциями, выбор между которыми предоставляется пользователю.
Код рабочего скрипта представлен ниже, после блока кода приведено описание работы
#!/bin/bash x=0 while [ $x = 0 ] do clear echo "Do u like to code (Y/N). Hit q to quit" read answer case "$answer" in Y) echo "It's great, of course u love it, especially in bash" x=1 ;; N) echo "U said NO. It's definetly is not true...Think it over again" x=1 ;; q) echo "Can't decide now. Let it go for now... Exiting in 5 seconds..." sleep 3 let x=5;while [ $x -gt 0 ];do clear;figlet $x;let x-=1;sleep 1;done echo "This is the end" x=1 ;; *) clear echo "Not an option" sleep 3 esac done
Bash меню проучилось интерактивным, программа выполняется тем или иным образом в зависимости от вводимой пользователем информации
Скрипт начинается с указания командного интерпретатора
#!/bin/bash
Определяем значение переменной и начинаем цикл while, выход из цикла будет происходить в случае если значение переменной будет отлично от нуля.
x=0
while [ $x = 0 ]
Пока x = 0 выводим при помощи echo строку «Do u like to code (Y/N). Hit q to quit»
Далее даем команду на считывание ответа и используя оператор case выводим различные результаты при разных ответах (предварительно очищаем экран clear)
do
clear
read answer
Если ответ Y — выводим «It's great, of course u love it, especially in bash»
case "$answer" in
Y)
echo "It's great, of course I love it, especially in bash"
x=1
;;
Приравниваем x=1 и выходим из цикла, ;; означает окончание каждого из возможных вариантов в case
Тем же образом выводим заданное предложение в случае ответа N
N)
echo "U said NO. It's definetly is not true...Think it over again"
x=1
;;
При нажатии на q будет осуществляться выходи из программы с выводом «This is the end», которому будет предшествовать отсчет от 5 до 0 с интервалом в 1 секунду. Цифры при обратном отсчете выводятся посредством утилиты figlet.
Утилита устанавливается из репозитория дистрибутива если её нет в системе. При использовании Debian или Ubuntu:
apt install figlet
Затем y чтобы подтвердить согласие на установку
q)
echo "Can't decide now. Let it go for now... Exiting in 5 seconds..."
sleep 3
let x=5;while [ $x -gt 0 ];do clear;figlet $x;let x-=1;sleep 1;done
echo "This is the end"
x=1
;;
При нажатии любой другой клавиши в момент считывания ответа будет выполняться условие определяемое при помощи *). Выводим «Not an option» и через 3 секунды задаем вопрос снова.
*)
clear
echo "Not an option"
sleep 3
Оператор case завершается вводом esac. За счет done завершается do
esac
done
Посмотрите другой пример использования оператора case в bash.