Конструкция case

Последнее обновление: 23.03.2024

Конструкция 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:~$ 
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850