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"
;;
esac3. Каждая из линий описана ниже:
- Первая строка скрипта начинается с шебанга (#!).
- Он указывает операционной системе использовать определенный интерпретатор для разбора сценария.
- Мы инициализировали переменную 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"
;;
esac3. Каждая из линий была рассмотрена ниже:
- Первая строка сценария начинается с шебанга (#!).
- Он указывает операционной системе использовать определенный интерпретатор для разбора сценария.
- Мы инициализировали переменную 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
done3. Каждая из линий описана ниже:
- Первая строка сценария начинается с шебанга (#!).
- Он указывает операционной системе использовать определенный интерпретатор для разбора сценария.
- Мы инициализировали массив 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"
;;
esac3. Каждая из строк поясняется ниже:
- Первая строка сценария начинается с шебанга (#!).
- Он указывает операционной системе использовать определенный интерпретатор для разбора сценария.
- Пользователю предлагается: «Вы студент? [Да или нет]".
- Теперь ответ дается пользователем через клавиатуру.
- Вывод ответа был обработан оператором 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"
;;
esac3. Каждая из строк поясняется ниже:
- $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