Конструкция case позволяет сопоставить некоторое выражение (например, переменную) с рядом значений. И если сравниваемое выражение равно определенному значению, то выполнить некоторый набор команд. Общий синтаксис конструкции:
case выражение in значение1) набор_команд1 ;; значение2) набор_команд2 ;; значениеN) набор_командN ;; esac
Конструкция начинается со слова case и заканчивается словом esac. После case идет выражение (например, переменная), которую надо сравнить с набором значений.
Блок каждого значения имеет следующий формат:
value) command ;;
Сначала идет значение, с которым сопоставляется выражение. После значения ставится закрывающая круглая скобка. Затем идут команды, которые выполняются, если переменная равна этому значению. И каждый такой блок завершается двойной точкой с запятой ;;
Рассмотрим простейший пример. Определим скрипт hello, который будет иметь следующий код:
#!/bin/bash # Скрипт, который использует конструкцию case # переменная, значение которой сравнивается с набором значений num=2 case $num in 1) echo "num = 1" ;; 2) echo "num = 2" ;; 3) echo "num = 3" ;; esac echo "Конец программы" exit 0
Здесь в конструкции case проверяется значение переменной num. А именно проверяется три варианта. Значение переменной последовательно сравнивается с тремя этими значениями. Например,
если переменная равна 1, то выполняется команда echo "num = 1"
и так далее.
Запустим скрипт:
eugene@Eugene:~$ bash hello num = 2 Конец программы eugene@Eugene:~$
И мы видим, что конструкция case сопоставила значение переменной num c 2 и выполнила соответствующую команду.
Если одно из значений успешно сопоставлено с выражением, то сопоставление с остальными значениями не происходит. Например:
#!/bin/bash # Скрипт, который использует конструкцию case # переменная, значение которой сравнивается с набором значений num=1 case $num in 1) num=2 # меняем значение переменной echo "num = 1" ;; 2) num=3 echo "num = 2" ;; 3) echo "num = 3" ;; esac echo "Конец программы" exit 0
Переменная num равна 1, и очевидно будет выполняться первый же блок в конструкции case:
1) num=2 # меняем значение переменной echo "num = 1" ;;
Но несмотря на то, что здесь значение переменной num меняется на 2, последующий блок, предназначенный для значения 2, выполняться не будет, что мы можем увидеть, запустив скрипт:
eugene@Eugene:~$ bash hello num = 1 Конец программы eugene@Eugene:~$
В примере выше значение переменной сравнивалось с тремя числами. Однако потенйиально значение переменной может представлять не только эти числа. И если к примеру, num была бы равна 4, то ни один из блоков команд в case не выполнялся. Тем не менее иногда бывает нужно обработать все остальные варианты, то есть выполнить некоторый набор команд по умолчанию. В этом случае мы можем использовать шабло *, который соответствует любому значению:
#!/bin/bash # Скрипт, который использует конструкцию case # переменная, значение которой сравнивается с набором значений num=4 case $num in 1) echo "num = 1" ;; 2) echo "num = 2" ;; *) echo "Неизвестное значение" ;; esac echo "Конец программы" exit 0
В данном случае, если переменная num не равна ни 1, ни 2, то выполняется команда echo "Неизвестное значение"
. Проверим, запустив скрипт:
eugene@Eugene:~$ bash hello Неизвестное значение Конец программы eugene@Eugene:~$
Еще стоит отметить, что мы можем проверять в одном блоке сразу несколько значений. Для этого сравниваемые значения разделяются вертикальной чертой |. Например:
#!/bin/bash # Скрипт, который использует конструкцию case # переменная, значение которой сравнивается с набором значений num=2 case $num in 1|2|3) echo "num равно или 1 или 2 или 3" ;; 4) echo "num равно 4" ;; *) echo "Неизвестное значение" ;; esac echo "Конец программы" exit 0
Первый вариант представляет сравнение с тремя числами: 1|2|3
. ТО есть первый блок команд выполняется, если переменная num равна или 1, или 2, или 3. Результат работы скрипта:
eugene@Eugene:~$ bash hello num равно или 1 или 2 или 3 Конец программы eugene@Eugene:~$