Wiki

Оператор выбова ("case")

Оператор выбора "case" имеет структуру:

     case   строка  in
	шаблон)  список команд;;
	шаблон)  список команд;;
	    ...
     esac

Здесь "case" "in" и "esac" - служебные слова. "Строка" (это может быть и один символ) сравнивается с "шаблоном". Затем выполняется "список команд" выбранной строки. Непривычным будет служебное слово "esac", но оно необходимо для завершения структуры.
Пример.
     ###
     # case-1: Структура "case".
     #         Уже рассматривавшийся в связи со
     #         структурой "if" пример проще и
     #         нагляднее можно реализовать с
     #         помощью структуры "case".
 
     echo -n " А какую оценку получил на экзамене?: "
     read z
     case $z in
	5) echo Молодец !            ;;
	4) echo Все равно молодец !  ;;
	3) echo Все равно !          ;;
	2) echo Все !                ;;
	*) echo  !                   ;;
     esac

Непривычно выглядят в конце строк выбора ";;", но написать здесь ";" было бы ошибкой. Для каждой альтернативы может быть выполнено несколько команд. Если эти команды будут записаны в одну строку, то символ ";" будет использоваться как разделитель команд.

Обычно последняя строка выбора имеет шаблон "*", что в структуре "case" означает "любое значение". Эта строка выбирается, если не произошло совпадение значения переменной (здесь $z) ни с одним из ранее записанных шаблонов, ограниченных скобкой ")". Значения просматриваются в порядке записи.

     ###
     # case-2:  Справочник.
     #          Для различных фирм по имени выдается
     #          название холдинга, в который она входит
 
     case $1 in
	     ONE|TWO|THREE) echo Холдинг: ZERO    ;;
		   MMM|WWW) echo Холдинг: Not-Net ;;
	 Hi|Hello|Howdoing) echo Холдинг: Привет! ;;
			 *) echo Нет такой фирмы  ;;
     esac

При вызове "case-2 Hello" на экран будет выведено:
     Холдинг: Привет!

А при вызове "case-2 HELLO" на экран будет выведено:
     Нет такой фирмы

Коль скоро слово "case" переводится как "выбор", то это как бы намек на то, что можно эту структуру использовать для реализации простейших меню.
     ###
     # case-3: Реализация меню с помощью команды "case"
     echo "Назовите файл, а затем (через пробел) наберите цифру, соответствующую требуемойобработке:
	    1 - отсортировать
	    2 - выдать на экран
	    3 - определить число строк  "
     read x y  # x - имя файла, y - что сделать
     case $y in
	1) sort   < $x               ;;
	2) cat    < $x               ;;
	3) wc -l  < $x               ;;
	*) echo "
		   Мы не знаем
		   такой команды ! " ;;
     esac

Разумеется, желания могут быть более сложные и на месте отдельных команд могут быть последовательности команд или вызовы
более сложных расчетов.

Напишем команду "case-4", которая добавляет информацию к файлу, указанного первым параметром (если параметр один), со стандартного входа, либо (если 2 параметра) из файла, указанного в качестве первого параметра:

     ###
     # case-4: Добавление в файл.
     #         Использование стандартной переменной.
     # "$#" -  число параметров при вводе расчета
     # ">>" -  перенаправление с добавлением в файл
 
     case $# in
	  1) cat >> $1                           ;;
	  2) cat >> $2 < $1                      ;;
	  *) echo "Формат: case-4 [откуда] куда" ;;
     esac

"$1" (при "$#=1") - это имя файла, в который происходит добавление со стандартного входа.
"$1" и "$2" (при $#=2) - это имена файлов , из которого ("$1") и в который ("$2") добавлять.

Во всех других случаях (*) выдается сообщение о том, каким должен быть правильный формат команды.