[Video] v20.29 Оператор ветвления – CASE.

Сегодня я продолжу рассказ о операторах ветвления. В предыдущих видео я уже рассказал о оператох if,then,else и elif.
В данном видео речь пойдёт о операторе case.
Используя оператор case можно существенно упростить скрипты в которых используются операторы ветвления и необходить выполять какого-либо действие в зависимости от того что ввёл пользователь. Уже было пару примеров в видео о Сравнении строковых переменных.
Оператор case позволяет проводить сравнение значения, например какой-либо переменной с диапазонами значений – я покажу это далее в примере, а так же упрощает синтаксис – нет необходимости постоянно писать elif и тп.

Сначала посмотрим на работу скрипта, а потом на его содержимое:
$ sh v20.29-case-script2.sh
Enter a character:1
You entered a digit.

$ sh v20.29-case-script2.sh
Enter a character:a
You entered a lower case alphabet.

$ sh v20.29-case-script2.sh
Enter a character:L
You entered an upper case alphber.

$ sh v20.29-case-script2.sh
Enter a character:%
You entered a special symbol.

$ sh v20.29-case-script2.sh
Enter a character:as
You entered more than one characters.

Содержимое скрипта(данный скрипт запускает в интерпретаторе sh – dash, так как в bash, в настойках по умолчанию, под [a-z] подпадают и значи верхнего регистра…)
$ cat v20.29-case-script2.sh
clear
echo "Enter a character:\c"
read var
case $var in
[a-z])
echo "You entered a lower case alphabet.";;
[A-Z])
echo "You entered an upper case alphber.";;
[0-9])
echo "You entered a digit.";;
?)
echo "You entered a special symbol.";;
*)
echo "You entered more than one characters.";;
esac

exit 0

[a-z]) – скобка говорит интерпретатору – shell, что при совпадении с условием, нужно выполнить следующее действие.
В данном случае echo ….
? – обозначает один символ
* – любое количество символов
;; – двойная точка с запятой говорит шелу, что описание данного условия закончены.
esac – по аналогии с fi говорит шелу, что работа данного оператора ветвления закончена.

На просторах интернета я нашёл следующий интересный пример работы данного оператора ветвления:
$ bash v20.29-case-script1.sh
Enter the name of an animal: dog
The dog has four legs.

$ bash v20.29-case-script1.sh
Enter the name of an animal: man
The man has two legs.

$ bash v20.29-case-script1.sh
Enter the name of an animal: kangaroo
The kangaroo has two legs.

$ bash v20.29-case-script1.sh
Enter the name of an animal: dino
The dino has an unknown number of legs.

<сам скрипт>
$ cat v20.29-case-script1.sh
echo -n "Enter the name of an animal: "
read ANIMAL
echo -n "The $ANIMAL has "
case $ANIMAL in
horse | dog | cat) echo -n "four";;
man | kangaroo ) echo -n "two";;
*) echo -n "an unknown number of";;
esac
echo " legs."

Оператор case часто применяется в скриптах, не только в таких показательных-демонстрационных как сегодня.
В моём видео о удалённом доступе на Raspberry Pi был показан скрипт, который ответственен за запус,остановку и перезапуск сервиса vnc на моём raspberry pi. В данном скрипте использовался оператор CASE.
Вот тот скрипт:
<часть удалена>
case "$1" in
start)
log_action_begin_msg "Starting vncserver for user '${USER}' on localhost:${DISPLAY}"
su ${USER} -c "/usr/bin/vncserver ${OPTIONS}"
;;

stop)
log_action_begin_msg "Stopping vncserver for user '${USER}' on localhost:${DISPLAY}"
su ${USER} -c "/usr/bin/vncserver -kill :${DISPLAY}"
;;

restart)
$0 stop
$0 start
;;
esac
exit 0

Здесь как я уже говорил производится выполнения запуска, остановки или перезапуска сервиса vnc. В ветке case происходит сравнения введённого пользователем значения (позиционного параметра) с заранее заданными – start, stop или restart. При совпадении введёного значения с одним из них выполняется заданное действие. Например, запись события в лог и запуск сервиса.

Подробнее смотрите в моём видео.
На сегодня всё, спасибо за внимание, надеюсь вам понравилось. =)
Подписывайтесь на канал!

Удачи!
Sources:
youtube
opennet
Bash Reference Manual