Bash-скрипты — описание дела
Оператор case в сценариях bash используется, когда необходимо принять решение против нескольких вариантов. Другими словами, это полезно, когда выражение может иметь несколько значений. Эту методологию можно рассматривать как замену множеству операторов if в скрипте. Оператор case имеет преимущество перед операторами if, потому что он улучшает читаемость нашего кода и его легче поддерживать. Операторы Case в сценарии Bash очень похожи на операторы Case в языке C. Но в отличие от C, оператор Bash Case прекращает поиск, как только происходит совпадение. Проще говоря, они не требуют какого-либо оператора break, который является обязательным для использования в C, чтобы прекратить дальнейший поиск шаблона.
Основной синтаксис оператора case приведен ниже.
Синтаксис:
case EXPRESSION in Pattern_Case_1) STATEMENTS ;; Pattern_Case_1) STATEMENTS ;; Pattern_Case_N) STATEMENTS ;; *) STATEMENTS ;; esac
- Оператор case начинается с ключевого слова case, за которым следует выражение и ключевое слово in .
- Он заканчивается ключевым словом esac .
- Можно использовать несколько вариантов шаблонов, разделенных символом | оператор.
- Оператор закрывающей скобки ')' используется для завершения списка вариантов шаблона.
- Регистр шаблона может содержать специальные символы.
- Случай шаблона и его тело называются предложением.
- За телом case шаблона должен следовать ;;.
- В случае, если выражение совпадает с двумя случаями шаблона, тогда в этом случае выполняется тело, соответствующее первому совпадающему случаю шаблона, который соответствует выражению.
- Подобно тому, как C предоставляет ключевое слово по умолчанию для оператора по умолчанию, аналогично в операторе case Bash мы можем использовать подстановочный знак звездочки (*) и определить окончательный вариант шаблона для определения случая по умолчанию.
- Если шаблон не соответствует, статус возврата равен нулю. В противном случае статус возврата является статусом выхода выполненного тела случая сопоставленного шаблона.
Пример 1: вывод описания для каждой опции
В этом примере сценарий позволяет пользователю выбрать отдел и показывает описание, соответствующее вводу, с помощью команды эха. В этом скрипте мы присвоили переменной DEPARTMENT значение «Информатика». Таким образом, выполняется тело первого case case шаблона.
Вы можете следовать инструкциям, приведенным ниже:
1. Откройте терминал (Ctrl+Alt+T) и создайте скрипт:
department.sh
2. Добавьте в сценарий следующие операторы:
#!/bin/bash DEPARTMENT="Computer Science" echo -n "Your DEPARTMENT is " case $DEPARTMENT in "Computer Science") echo -n "Computer Science" ;; "Electrical and Electronics Engineering" | "Electrical Engineering") echo -n "Electrical and Electronics Engineering or Electrical Engineering" ;; "Information Technology" | "Electronics and Communication") echo -n "Information Technology or Electronics and Communication" ;; *) echo -n "Invalid" ;; esac
3. Каждая из линий описана ниже:
- Первая строка скрипта начинается с шебанга (#!).
- Он указывает операционной системе использовать определенный интерпретатор для разбора сценария.
- Мы инициализировали переменную DEPARTMENT как «Computer Science».
- Теперь мы используем оператор case.
- Каждое выражение обрабатывается оператором case.
- Последняя строка, esac, используется для завершения оператора case.
4. Сохраните сценарий.
5. Запустите скрипт.
./department.sh
Выход:
Пример 2. Использование нескольких шаблонов
В каждом предложении мы можем использовать несколько шаблонов. Если выражение совпадает хотя бы с одним случаем шаблона, тогда выполняется тело предложения. В этом скрипте мы присвоили переменной DEPARTMENT значение «Электроника и связь». Третий случай шаблона имеет два значения, разделенных оператором вертикальной черты ( | ). Таким образом, выполняется тело третьего кейса шаблона.
Вы можете следовать инструкциям, приведенным ниже:
1. Откройте терминал (Ctrl+Alt+T) и создайте скрипт:
department.sh
2. Добавьте в сценарий следующие операторы:
#!/bin/bash DEPARTMENT="Electronics and Communication" echo -n "Your DEPARTMENT is " case $DEPARTMENT in "Computer Science") echo -n "Computer Science" ;; "Electrical and Electronics Engineering" | "Electrical Engineering") echo -n "Electrical and Electronics Engineering or Electrical Engineering" ;; "Information Technology" | "Electronics and Communication") echo -n "Information Technology or Electronics and Communication" ;; *) echo -n "Invalid" ;; esac
3. Каждая из линий была рассмотрена ниже:
- Первая строка сценария начинается с шебанга (#!).
- Он указывает операционной системе использовать определенный интерпретатор для разбора сценария.
- Мы инициализировали переменную DEPARTMENT как «Электроника и связь».
- Теперь мы используем оператор case.
- Каждое выражение обрабатывается оператором case.
- Последняя строка, esac, используется для завершения оператора case.
4. Сохраните сценарий.
5. Запустите скрипт.
./department.sh
Выход:
3. Сохраните сценарий.
5. Запустите скрипт.
./department.sh
Пример 3: циклы for
В этом скрипте мы назначили кафедру трем ученикам одного класса в массиве DEPARTMENT. Другими словами, мы собираемся обработать более одного выражения, описанного в переменной DEPARTMENT. Чтобы перебрать несколько выражений, мы можем использовать цикл for.
Вы можете следовать инструкциям, приведенным ниже:
1. Откройте терминал (Ctrl+Alt+T) и создайте скрипт:
department.sh
2. Добавьте в сценарий следующие операторы:
#!/bin/bash DEPARTMENT=("Electronics and Communication", "Computer Science", "Information Technology") for value in "${DEPARTMENT[@]}" do case $value in "Computer Science") echo -n "Computer Science " ;; "Electrical and Electronics Engineering" | "Electrical Engineering") echo -n "Electrical and Electronics Engineering or Electrical Engineering " ;; "Information Technology" | "Electronics and Communication") echo -n "Information Technology or Electronics and Communication " ;; *) echo -n "Invalid " ;; esac done
3. Каждая из линий описана ниже:
- Первая строка сценария начинается с шебанга (#!).
- Он указывает операционной системе использовать определенный интерпретатор для разбора сценария.
- Мы инициализировали массив DEPARTMENT тремя строковыми литералами.
- Теперь с помощью цикла for мы перебираем массив элементов.
- Каждое выражение обрабатывается оператором case.
- Последняя строка, esac, используется для завершения оператора case.
4. Сохраните сценарий.
5. Запустите скрипт.
./department.sh
Выход:
Пример 4. Запросите у пользователя ответ «Да» или «Нет».
Вы можете следовать инструкциям, приведенным ниже:
1. Откройте терминал (Ctrl+Alt+T) и создайте скрипт:
student.sh
2. Добавьте в сценарий следующие операторы:
#!/bin/bash echo -n "Are you a student? [yes or no]: " read response case $response in "Y" | "y" | "YES" | "Yes" | "yes") echo -n "Yes, I am a student." ;; "N" | "n" | "No" | "NO" | "no" | "nO") echo -n "No, I am not a student."; ;; *) echo -n "Invalid input" ;; esac
3. Каждая из строк поясняется ниже:
- Первая строка сценария начинается с шебанга (#!).
- Он указывает операционной системе использовать определенный интерпретатор для разбора сценария.
- Пользователю предлагается: «Вы студент? [Да или нет]".
- Теперь ответ дается пользователем через клавиатуру.
- Вывод ответа был обработан оператором case.
- Последняя строка, esac, используется для завершения оператора case.
4. Сохраните сценарий.
5. Запустите сценарий с помощью приведенной ниже команды.
./student.sh
Выход:
Пример 5: Отправка сигнала процессу
Вы можете следовать инструкциям, приведенным ниже:
1. Откройте терминал (Ctrl+Alt+T) и создайте скрипт:
signals.sh
2. Добавьте в сценарий следующие операторы:
#!/bin/bash if [ $# -lt 2 ] then echo "Usage : $0 Signalnumber PID" exit fi # Case statement # Signal number (expression) case "$1" in 1) echo "Sending SIGHUP signal....." kill -SIGHUP $2 ;; 2) echo "Sending SIGINT signal....." kill -SIGINT $2 ;; 3) echo "Sending SIGQUIT signal....." kill -SIGQUIT $2 ;; 4) echo "Sending SIGKILL signals....." kill -SIGKILL $2 ;; *) echo "Signal number $1 has not been processed" ;; esac
3. Каждая из строк поясняется ниже:
- $1 — это номер сигнала, а $2 — идентификатор процесса.
- Чтобы передать или отправить сигнал данному идентификатору процесса, мы используем команду kill.
- Это запустит команду сна на несколько секунд.
- Тело необязательного последнего сравнения *) будет выполнено по умолчанию.
4. Сохраните сценарий.
5. Запустите сценарий с помощью приведенной ниже команды.
./signals.sh
Выход:
$ sleep 10000 $ ps -a | grep sleep 23277 pts/2 00:00:00 sleep $ ./signals.sh 9 31231 Sending SIGKILL signal $ sleep 10000 Killed