В bash case используется при обработке циклов и условий в них для предоставления вариантов выбора, например в интерактивном меню.
Часто с операторами case оказывается полезным совмещать использование функций. Рассмотрим пример подобного совмещения.
Скрипт полностью приведен ниже, далее дается разъяснение принципов его работы.
#!/bin/bash x=0 function debian(){ clear echo "Do u prefer Debian Mint or Ubuntu?" read debian case "$debian" in [Uu]buntu) echo "oh, u like Ubuntu";; [Mm]int) echo "good, u like Linux Mint";; *) echo "Um? U typed smth that's not right";; esac x=1 } while [ $x = 0 ] do clear echo "Do u use Debian or CentOS?" read fruit case "$fruit" in [Dd]ebian) debian x=1 ;; [Cc]ent[Oo][sS]) echo "U use CentOS" x=1 ;; *) echo "That is not an option" sleep 1 clear echo "Please type either Debian or CentOS" sleep 1 ;; esac done
bash case — объяснение принципов работы скрипта и функцией
Первой строкой указывается имя интерпретатора команд
#!/bin/bash
Назначается значение переменной, приравниваем x нулю, чтобы выйти из цикла будет значение переменной итерировать
x=0
Создаем функцию debian, выводящую вопрос «Do u prefer Debian Mint or Ubuntu?» и считывающую ответ пользователя.
function debian(){
clear
echo "Do u prefer Debian Mint or Ubuntu?"
read debian
Используя case задаем две опции:
case "$debian" in [Uu]buntu) echo "oh, u like Ubuntu";;
Если ответ Ubuntu (с учетом регистра в первом символе) выводим «oh, u like Ubuntu»
[Mm]int) echo "good, u like Linux Mint";;
В случае если пользователь выбрал Mint выводим «good, u like Linux Mint»
*) echo "Um? U typed smth that's not right";;
Если совпадения не найдено — «Um? U typed smth that's not right»
esac x=1 }
Завершаем case с esac и интерируем значение x чтобы выйти из цикла.
Функция сейчас только задана, вызываться она будет на втором этапе выполнения программы.
Начало собственно программы (так как его увидит пользователь).
while [ $x = 0 ] do
Очищаем экран и задаем главный вопрос «Do u use Debian or CentOS?»
clear echo "Do u use Debian or CentOS?" read systems
Считываем ответ пользователя при помощи read и реагируем на совпадения
case "$systems" in [Dd]ebian) debian x=1 ;;
При указании на Debian в любом регистре (первый символ) вызываем заданную ранее функцию debian, которая задаст уточняющий вопрос о любимом дистрибутиве основанном на debian
В случае выбора CentOS просто выводим фразу «U use CentOS».
[Cc]ent[Oo][sS]) echo "U use CentOS" x=1 ;;
Регистр здесь учитываем как для первого знака, так и для последних двух
*) echo "That is not an option" sleep 1 clear echo "Please type either Debian or CentOS" sleep 1 ;; esac done
Для любого другого ввода пользователя будет действовать правило заданное с *). Ответ системы будет «That is not an option», затем пауза продолжительностью 1 секунду и повторный запуск основной программы с начала.
Вывод скрипта на последнем вопросе:
Используя case можно, например, написать простое консольное меню