Заявление о случае 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
Объяснение:
- Ключевые слова
"case"
и"esac"
отмечают начало и конец оператора case. - За регистром ключевого слова должно следовать
выражение
. Это выражение будет оценено, и выходные данные будут проверены по списку шаблонов. - После выражения следует написать ключевое слово
"in"
, которое указывает на"значение в шаблонах"
. - Вы можете создать столько узоров, сколько захотите. Вы можете рассматривать каждый шаблон как предложение
if
иelif
в условном операторе. Если значение, полученное из выражения, соответствует шаблону, этот шаблон запустит свой блок кода. Остальные шаблоны будут пропущены. - Каждый оператор внутри шаблона должен заканчиваться двойной точкой с запятой (
;;
). - Подобно предложению else в операторе if, в операторе case существует шаблон по умолчанию, называемый звездочки (
*
), который будет запускать свой блок код, если ни один из шаблонов не соответствует.
Пример 1. Калькулятор с использованием оператора case
В этом примере я создал простой калькулятор, используя оператор case. Позвольте мне объяснить, что происходит, когда вы запускаете этот код.
- Пользователю предлагается ввести два числа, которые сохраняются в переменных
"X"
и"Y"
. - Пользователю предлагается ввести тип операции (сложение, вычитание, умножение, деление) и сохранить его в переменной ОПЕРАТОР.
- В операторе case оценивается переменная "OPERATOR" и различные шаблоны (
+
,-
,x
,/
,%
) созданы для разных операций. - Если шаблон соответствует, конкретный шаблон выполнит свой оператор, пропуская все остальные шаблоны в операторе case.
- Если вы попытаетесь ввести какие-либо другие значения, кроме нужных арифметических операторов, то шаблон по умолчанию (
*
) выполнит свой оператор.
#!/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 для начинающих