Bash-скрипты — описание дела

Опубликовано: 30 Сентября, 2022

Оператор 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