Bash Scripting – Case Statement
Заяву про справу у сценаріях 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:
-
EXPRESSION>це змінна або значення, яке оцінюється за різними шаблонами (випадками) для пошуку збігу. - Інструкція case починається з ключового слова
case>а потімEXPRESSION>підлягає оцінці. - Кожен випадок визначається a
Pattern_Case>який представляє конкретне значення або шаблон, який потрібно порівняти зEXPRESSION>. - Після кожного
Pattern_Case>, є оператори, які потрібно виконати, якщоEXPRESSION>відповідає конкретномуPattern_Case>. Ці твердження позначаютьсяSTATEMENTS>. - The
;;>в кінці кожногоSTATEMENTS>block вказує на кінець блоку case. - The
*)>є окремим випадком, відомим як випадок за замовчуванням. Якщо жоден із попередніх шаблонів не відповідаєEXPRESSION>,STATEMENTS>під*)>блок буде виконано. - The
esac>Ключове слово позначає кінець оператора case.
- Якщо шаблон не знайдено, статус повернення дорівнює нулю. В іншому випадку статус повернення є статусом виходу виконаного тіла відповідного шаблону.
- Подібно до того, як C надає ключове слово за замовчуванням для оператора за замовчуванням, так само в операторі Case Bash ми можемо використовувати символ зірочки підстановки (*) і визначити остаточний регістр шаблону, щоб визначити регістр за замовчуванням.
Приклад 1: Виведіть опис для кожного параметра
У цьому прикладі сценарій дозволяє користувачеві вибрати відділ і показує опис, що відповідає введеним даних за допомогою команди echo. У цьому сценарії ми призначили змінну DEPARTMENT як Computer Science. Таким чином, виконується тіло першого шаблону.
Ви можете дотримуватися наведених нижче інструкцій.
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. Збережіть сценарій і зробіть його виконуваним.
chmod +x department.sh
5. Запустіть сценарій.
./department.sh
Вихід:
Приклад 2: Використання кількох шаблонів
У кожному пункті ми можемо використовувати декілька випадків шаблону. Якщо вираз збігається принаймні з одним випадком шаблону, тоді виконується тіло пропозиції. У цьому сценарії ми призначили змінну DEPARTMENT як Electronics and Communication. Третій випадок шаблону має два значення, розділених вертикальною рискою ( | ). Таким чином, виконується тіло третього шаблону.
Ви можете дотримуватися наведених нижче інструкцій.
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 як Electronics and Communication.
- Тепер ми використовуємо оператор case.
- Кожен вираз було оброблено через оператор case.
- Останній рядок, esac, використовувався для завершення оператора case.
4. Збережіть сценарій і зробіть його виконуваним.
chmod +x department.sh
5. Запустіть сценарій.
./department.sh
Вихід:
Приклад 3: для циклів
У цьому сценарії ми призначили відділ трьом учням класу в масиві 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. Збережіть сценарій і зробіть його виконуваним.
chmod +x department.sh
5. Запустіть сценарій.
./department.sh
Вихід:
Приклад 4. Запит користувача з «Так» або «Ні».
Ви можете дотримуватися наведених нижче інструкцій.
1. Відкрийте термінал (Ctrl + Alt + T) і створіть скрипт:
department.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. Збережіть сценарій і зробіть його виконуваним.
chmod +x department.sh
5. Запустіть сценарій за допомогою наведеної нижче команди.
./department.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
Приклад 3: для циклів