Поиск по сайту:

Заявление о случае Bash

Примеры операторов случая Bash | Как использовать оператор Case в сценариях Bash

В предыдущей статье мы увидели, как работать с условными операторами в bash для оценки условий и принятия решений на основе результатов. Аналогичным образом, в этой статье мы узнаем, как использовать оператор case в сценариях Bash, который также используется для оценки условий. Вы можете использовать оператор случая Bash вместо написания длинного списка операторов if..elif..else. Если вы понятия не имеете об условных операторах, у нас есть подробная статья на эту тему. Советую вам ознакомиться с ним, прежде чем читать эту статью.

  • Сценарии Bash – условные операторы

Синтаксис оператора Case

Синтаксис оператора case в bash приведен ниже:

case expression in
  pattern1) STATEMENTS ;;
  pattern2) STATEMENTS ;;
  Pattern3 | Pattern4 | pattern5) STATEMENTS ;;
  pattern-N) STATEMENTS ;;
  *) STATEMENTS ;;
esac

Объяснение:

  1. Ключевые слова "case" и "esac" отмечают начало и конец оператора case.
  2. За регистром ключевого слова должно следовать выражение. Это выражение будет оценено, и выходные данные будут проверены по списку шаблонов.
  3. После выражения следует написать ключевое слово "in", которое указывает на "значение в шаблонах".
  4. Вы можете создать столько узоров, сколько захотите. Вы можете рассматривать каждый шаблон как предложение if и elif в условном операторе. Если значение, полученное из выражения, соответствует шаблону, этот шаблон запустит свой блок кода. Остальные шаблоны будут пропущены.
  5. Каждый оператор внутри шаблона должен заканчиваться двойной точкой с запятой (;;).
  6. Подобно предложению else в операторе if, в операторе case существует шаблон по умолчанию, называемый звездочки (*), который будет запускать свой блок код, если ни один из шаблонов не соответствует.

Пример 1. Калькулятор с использованием оператора case

В этом примере я создал простой калькулятор, используя оператор case. Позвольте мне объяснить, что происходит, когда вы запускаете этот код.

  1. Пользователю предлагается ввести два числа, которые сохраняются в переменных "X" и "Y".
  2. Пользователю предлагается ввести тип операции (сложение, вычитание, умножение, деление) и сохранить его в переменной ОПЕРАТОР.
  3. В операторе case оценивается переменная "OPERATOR" и различные шаблоны (+, -,x,/,% ) созданы для разных операций.
  4. Если шаблон соответствует, конкретный шаблон выполнит свой оператор, пропуская все остальные шаблоны в операторе case.
  5. Если вы попытаетесь ввести какие-либо другие значения, кроме нужных арифметических операторов, то шаблон по умолчанию (*) выполнит свой оператор.
#!/usr/bin/env bash

read -p "Enter the first number(X)  :  " X
read -p "Enter the second number(Y) :  " Y
read -p "
Addition => +
Subtract => -
Multiply => x
Division => /
Reminder => %

Choose any one operator   :  " OPERATOR
case "$OPERATOR" in
 +)
   echo -e "\nAddition of X and Y is $(( X + Y ))" ;;
 -)
   echo -e "\nSubtraction of X and Y is $(( X - Y ))" ;;
 x)
   echo -e "\nMultiply X and Y is $(( X * Y ))" ;;
 /)
   echo -e "\nDivision of X and Y is $(( X / Y ))" ;;
 %)
   echo -e "\nReminder of X and Y is $(( X % Y ))" ;;
 *)
   echo -e "\n[ERROR] You have chosen an operator that is not in the list.
You can choose either(+, -, x, /, %) operator from the list.
Rerun the program again."
esac

Взгляните на изображение ниже: я отправляю код и выбираю Оператор сложения.

Оператор сложения

Я снова запускаю тот же код, но на этот раз задаю случайное значение, которое заставит шаблон по умолчанию (*) выполнить свой оператор.

Шаблон по умолчанию

Пример 2. Создание нескольких шаблонов в одном предложении

В предыдущем примере мы создали разные шаблоны для разных арифметических операторов. Также возможно создать несколько шаблонов в одном предложении, и если какой-либо из шаблонов совпадает, конкретный оператор будет выполнен. Синтаксис будет таким же, но вы добавите символ вертикальной черты (|) и разные шаблоны в одной строке, как показано ниже.

case expression in
   Pattern1 | Pattern2 | pattern3) 
   STATEMENTS ;;
   *)
   STATEMENTS ;;
esac

В приведенном ниже примере пользователь вводит год в качестве входных данных и получает данные оранжевой крышки из данных IPL. В 2015, 2017 и 2019 годах один и тот же игрок выигрывал оранжевую кепку, поэтому я создал другой год в качестве образца в том же пункте.

read -p "Choose the year between 2015 - 2021 to get orange cap player name: " CAP
case "$CAP" in
 2015 | 2017 | 2019)
   echo -e "\nOrange cap winner for $YEAR is David Warner" ;;
 2016)
   echo -e "\nOrange cap winner for $YEAR is Virat Kohli" ;;
 2018)
  echo -e "\nOrange cap winner for $YEAR is Kane Williamson" ;;
 2020)
   echo -e "\nOrange cap winner for $YEAR is KL Rahul" ;;
 2021)
   echo -e "\nOrange cap winner for $YEAR is Ruturaj Gaikwad" ;;
 *)
   echo -e "\n[ERROR] Enter the year between 2015 - 2021."
esac

Несколько шаблонов в одном предложении

Пример 3. Сопоставление шаблонов в операторе case

Сопоставление с образцом можно использовать в операторах case. Я использую тот же пример из предыдущего раздела, но добавляю дополнительный шаблон (20[2-9][2-9]), где, если пользователь вводит любой год выше В 2021 году он напечатает сообщение «серия еще не вышла».

read -p "Choose the year between 2015 - 2021 to get orange cap player name: " CAP
case "$CAP" in
 2015 | 2017 | 2019)
   echo -e "\nOrange cap winner for $YEAR is David Warner" ;;
 2016)
   echo -e "\nOrange cap winner for $YEAR is Virat Kohli" ;;
 2018)
  echo -e "\nOrange cap winner for $YEAR is Kane Williamson" ;;
 2020)
   echo -e "\nOrange cap winner for $YEAR is KL Rahul" ;;
 2021)
   echo -e "\nOrange cap winner for $YEAR is Ruturaj Gaikwad" ;;
 20[2-9][2-9])
   echo -e "\nSeries is yet to happen for the year $CAP" ;;
 *)
   echo -e "\n[ERROR] Enter the year between 2015 - 2021."
esac

Оператор Case с сопоставлением с образцом

Пример 4. Получите подтверждение пользователя

Иногда вам может потребоваться от пользователя предоставить подтверждение для перехода к следующему шагу вашей программы. Использование оператора case было бы хорошим выбором для этого варианта использования.

В предыдущем примере шаблон записывается в одну строку, а операторы в другую, но вы также можете писать шаблоны и операторы в одну строку, как показано ниже.

read -p "Input file is received in CSV format, Please confirm to load the data into production database  : " CONFIRM
case "$CONFIRM" in
 [Yy] | [Yy][Ee][Ss] ) echo "++ Running the utility to load the data to the database.." ;;
 [Nn] | [Nn][Oo] ) echo -e "++ Skipping load db step upon user confirmation..\n Exiting the script.." ;;
 *) echo -e "[ERROR] = Wrong Input, Exiting the script.."
esac

Подтверждение пользователя с помощью оператора Case

Пример 5. Оператор Case с кодами возврата

Вы можете написать логику для захвата кода возврата ранее запущенной команды и выполнения некоторых действий, используя операторы case. Я создаю диалоговое окно графического интерфейса, чтобы принять имя пользователя и пароль от пользователя, используя zenity. Если пользователь успешно вводит имя пользователя и пароль, zenity выдаст код возврата как ноль, и на основе этого я добавил логику для добавления нового пользователя. Если значение отличается от нуля, будет выдано сообщение об ошибке.

INFO=$(zenity --password --username)
case $? in
 0)
   USERNAME=$(echo ${INFO} | awk -F "|" '{ print $1 }')
   PASSWORD=$(echo ${INFO} | awk -F "|" '{ print $2 }')
   useradd -m -p "${PASSWORD}" "${USERNAME}"
   ;;
 *)
   echo "[ERROR] - User not added."
esac

Скрипт создания пользователя

Я нажал кнопку «Отмена» в диалоговом окне, поэтому мне выдала ошибку с использованием шаблона по умолчанию (*).

Отменено диалоговое окно

Рекомендуем прочитать:

  • Как создавать диалоговые окна графического пользовательского интерфейса в сценариях Bash с помощью Zenity в Linux и Unix

Справочные сценарии

Чтобы освоиться с операторами Case, вы можете просмотреть существующие коды, написанные с использованием операторов Case. Лучше всего начать с чтения сценариев запуска в каталоге /etc/init.d. Например, на моем компьютере установлен виртуальный бокс, и в каталоге /etc/init.d есть файл запуска. Существует раздел кода, написанный с использованием оператора Case, который дает хорошее представление о том, как работает оператор Case.

cd /etc/init.d/
cat bluetooth

Скрипты запуска

Заключение

В этой статье мы рассмотрели что такое оператор case в Bash и различные способы его использования. И условный оператор, и оператор Case служат одной и той же цели. Вы должны лучше понимать, какой метод подходит для конкретного варианта использования. Операторы Case также будут использоваться, когда вам нужно создать справочные функции с помощью программ getopt и getopts. Создайте сценарий и начните практиковать приведенные здесь примеры, чтобы лучше понять операторы падежа.

Руководства по написанию сценариев Bash:

  • Сценарии Bash – условные операторы
  • Скрипты Bash: манипулирование строками
  • Сценарии Bash: команда Printf с примерами
  • Скрипты Bash: индексированные массивы с примерами
  • Скрипты Bash: объяснение ассоциативных массивов на примерах
  • Скрипты Bash: цикл For с примерами
  • Скрипты Bash: циклы while и Until с примерами
  • Перенаправление Bash, объясненное примерами
  • Сценарии Bash: переменные, поясняемые примерами
  • Скрипты Bash: функции, поясняемые примерами
  • Команда Bash Echo с примерами для Linux
  • Руководство по Bash Heredoc для начинающих

Статьи по данной тематике