Оператор case в bash - это простейшая форма условного оператора if elif else. Оператор case упрощает сложные условия с несколькими вариантами выбора. Этот оператор проще в обслуживании и более читабелен, чем вложенные операторы if.
Оператор case проверяет входное значение, пока не найдет соответствующий шаблон, и выполняет команду, связанную с этим входным значением. Таким образом, это отличный выбор для создания меню, в котором пользователи выбирают опцию, вызывающую соответствующее действие.
Синтаксис оператора bash case
Оператор bash case имеет следующий синтаксис:
1 2 3 4 5 6 7 8 9 10 11 12 | case $variable in шаблон-1) команды;; шаблон-2) команды;; шаблон-3) команды;; шаблон-N) команды;; *) команды;; esac |
Оператор case начинается с ключевого слова case, за которым следует переменная $ и ключевое слово in. Оператор заканчивается ключевым словом case в обратном порядке - esac.
Сценарий сравнивает вводимое значение $variable с шаблонами в каждом пункте, пока не найдет совпадение.
Шаблоны
- Шаблон и его команды составляют предложение, которое заканчивается символом ;;.
- Шаблоны поддерживают специальные символы.
- Оператор ) завершает список шаблонов.
- Оператор | разделяет несколько шаблонов.
- Скрипт выполняет команды, соответствующие первому шаблону, совпадающему с входной переменной $variable.
- Символ звездочки * определяет случай по умолчанию, обычно в последнем шаблоне.
Скрипт имеет два статуса выхода:
- 0. Статус возврата, когда входные данные не совпадают с шаблоном.
- Статус выполненной команды. Если команда соответствует входной переменной шаблону, возвращается статус выхода выполненной команды.
Примеры использования оператора bash case
В этом разделе показаны практические примеры использования оператора bash case.
Пример 1: Вывод описания для каждого варианта
Следующий пример представляет собой сценарий, который позволяет пользователю выбрать цвет и выводит комментарий, соответствующий введенным данным, используя команду echo.
Следуйте приведенным ниже инструкциям:
1. Откройте терминал (Ctrl + Alt + T) и создайте скрипт:
1 | nano color.sh |
2. Добавьте в сценарий следующие строки:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | #!/bin/bash echo "Какой цвет вам нравится больше всего?" echo "1 - синий" echo "2 - Красный" echo "3 - Желтый" echo "4 - Зеленый" echo "5 - оранжевый" read color; case $color in 1) echo "Синий - основной цвет.";; 2) echo "Красный - основной цвет.";; 3) echo "Желтый - основной цвет.";; 4) echo "Зеленый - вторичный цвет.";; 5) echo "Оранжевый - вторичный цвет.";; *) echo "Этот цвет недоступен. Пожалуйста, выберите другой.";; esac |
Каждая из строк играет следующую роль:
- Первая строка в каждом скрипте - это обычно shebang (#!), который указывает операционной системе, какой интерпретатор использовать для разбора файла.
- Строки 2-7 - это меню опций, предлагаемых пользователю на выбор.
- Переменная read color; запрашивает у пользователя ответ и сохраняет его.
- Оператор case содержит возможные ответы, соответствующие введенным пользователем данным. В данном примере выходом является вывод команды echo.
- Последняя строка, esac, завершает оператор case.
3. Сохраните сценарий и выйдите
4. Перед запуском каждого скрипта убедитесь, что он имеет chmod, чтобы сделать его исполняемым:
1 | chmod +x color.sh |
5. Запустите скрипт:
1 | ./color.sh |
Пример оператора bash case, в котором пользователь получает разное сообщение в зависимости от вводимых данных.
Сценарий предлагает меню опций и выводит другое сообщение в зависимости от выбранной опции.
Пример 2: Использование нескольких шаблонов
Оператор case позволяет использовать несколько шаблонов в каждом пункте. Если выражение соответствует указанным шаблонам, сценарий выполняет команды в этом пункте.
В этом примере сценария пользователю предлагается ввести месяц и выводится количество дней. Возможны три варианта ответа:
- 30 дней.
- 31 день.
- 28 или 29 дней для февраля.
Для создания сценария выполните следующие шаги:
1. Создайте сценарий month.sh, выполнив:
1 | nano month.sh |
2. Введите следующие строки и сохраните сценарий:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | #!/bin/bash shopt -s nocasematch echo "Введите название месяца". read month case $month in February) echo "В месяце 28/29 дней.";; April | June | September | November) echo "В месяце 30 дней.";; January | March | May | July | August | October | December) echo "В месяце 31 день.";; *) echo "Неизвестный месяц. Пожалуйста, проверьте, правильно ли вы ввели название месяца: $month";; esac |
В приведенном выше примере:
- Команда shopt с опцией -s nocasematch уменьшает вероятность ошибки, поскольку сопоставление шаблонов нечувствительно к регистру.
- Символ | разделяет шаблоны в каждом из пунктов.
3. Сделайте скрипт исполняемым:
1 | chmod +x month.sh |
4. Запустите скрипт:
1 | ./month.sh |
Сценарий игнорирует различия в регистре и выводит правильное количество дней в выбранном месяце.
Пример 3: цикл for
Используйте цикл for в операторах case, когда необходимо обработать множество выражений. Следующий сценарий возвращает все типы файлов из каталога.
Выполните следующие шаги:
1. Создайте сценарий оболочки:
1 | nano filelist.sh |
2. Введите следующие строки, а затем сохраните сценарий:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | #!/bin/bash for file in $(ls) do Extension=${file##*.} case "$Extension" in sh) echo "Shell скрипт: $file";; md) echo "Файл markdown: $file";; png) echo "Файл изображения PNG: $file";; txt) echo "Текстовый файл: $file";; zip) echo "Архив: $file";; conf) echo "Конфигурационный файл: $file";; py) echo "Скрипт Python: $file";; *) echo "Неизвестный тип файла: $file";; esac done |
В приведенном выше примере:
- Команда ls извлекает список файлов из каталога.
- В цикле for применяется группировка файлов для извлечения расширения каждого файла.
3. Сделайте скрипт исполняемым:
1 | chmod +x filelist.sh |
4. Выполните сценарий:
1 | ./filelist.sh |
Сценарий идентифицирует каждый тип файла, присутствующий в текущем каталоге.
Пример 4: Создание адресной книги
Используйте оператор case для создания простой базы данных и быстрой генерации запрашиваемой информации. В следующем примере выводятся имя, адрес электронной почты и адрес выбранного человека:
1. Создайте сценарий:
1 | nano phonebook.sh |
2. Добавьте следующие строки и сохраните сценарий:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | #!/bin/bash echo "Выберите контакт для отображения информации:" echo "[C]hris Ramsey" echo "[J]ames Gardner" echo "[S]arah Snyder" echo "[R]ose Armstrong" read person case "$person" in "C" | "c" ) echo "Крис Рэмси" echo "27 Railroad Dr. Bayside, NY";; "J" | "j" ) echo "James Gardner" echo "31 Green Street, Green Cove Springs, FL";; "S" | "s" ) echo "Sarah Snyder" echo "Sarah Snyder" echo "8059 N. Hartford Court, Syosset, NY";; "R" | "r") echo "Rose Armstrong" echo "49 Woodside St., Oak Forest, IL";; *) echo "Контакт не существует.";; esac |
3. Сделайте скрипт исполняемым:
1 | chmod +x phonebook.sh |
4. Выполните скрипт:
1 | ./phonebook.sh |
Сценарий выводит контактные данные выбранного человека. Выбор варианта, который не указан в списке, уведомляет пользователя о том, что контакт не существует.
Пример 5: Проверка типа символов
В следующем примере показано, как с помощью оператора case проверить, какой тип символов ввел пользователь.
Выполните следующие шаги:
1. Создайте сценарий:
1 | nano character.sh |
2. Добавьте следующие строки и сохраните скрипт:
1 2 3 4 5 6 7 8 9 10 | #!/bin/bash echo "Введите символ:" read var case $var in [[:lower:]) echo "Вы ввели строчный символ.";; [[[:upper:]]) echo "Вы ввели заглавный символ.";; [0-9]) echo "Вы ввели цифру.";; ?) echo "Вы ввели специальный символ.";; *) echo "Вы ввели несколько символов.";; esac |
В приведенном выше примере:
- Управляющая переменная $var хранит вводимые данные.
- Вместо того чтобы вводить все возможные комбинации для сравнения, используйте квадратные скобки [] для обозначения диапазона символов. Для диапазонов POSIX используйте двойные квадратные скобки [[]]. if-else требует ввода каждого символа условия по отдельности.
- Символ ? охватывает символы, которые не являются строчными, прописными или цифрами. Он заменяет только один символ, в отличие от *, который заменяет все остальные, не предусмотренные условиями выше.
Хотя можно использовать [a-z] для обозначения диапазона строчных символов, в некоторых дистрибутивах Linux символы верхнего регистра также входят в данную последовательность.
3. Измените права доступа, чтобы сделать сценарий исполняемым:
1 | chmod +x character.sh |
4. Выполните скрипт:
1 | ./character.sh |
Заключение
Это руководство показало вам, как использовать оператор bash case для упрощения сложных условий при работе с несколькими вариантами. Создавайте различные сценарии для проверки строк на соответствие шаблонам и обработки командной строки при обнаружении совпадения. Используйте различные команды или циклы для создания расширенных сценариев bash.