Операционная система UNIX

       

Условные операторы



9.3.7. Условные операторы

Оператор if ... then

Команда if говорит shell программе, что нужно выполнить последовательность команд после then, если последняя команда в списке команд конструкции if выполнилась успешно. Конструкции if заканчиваются ключевым словом fi.

Общий формат конструкции if: if<CR> command_1<CR> . . . last command<CR> then<CR> command_1<CR> . . . last command<CR> fi<CR>

Например, shell программа search демонстрирует применение конструкции if ... then. Программа search использует команду grep для поиска слова в файле. Если grep выполнилась успешно, то программа отображает найденное слово. Экран будет выглядеть следующим образом: $ cat search<CR> echo Type in the word and the file name. read word file if grep $word $file then echo $word is in $file fi $



Эта программа отображает вывод команды grep. Если вы хотите сохранить ответ системы на команду grep в вашей программе, то воспользуйтесь файлом /dev/null, изменив командную строку if на следующую: if grep $word $file > /dev/null<CR>

Теперь выполните команду search. Она ответит только сообщением, указанным после команды echo.

Конструкция if ... then ... else может исполнять альтернативный набор команд, стоящий после else, в случае, если последовательность if является ложью. Формат этой конструкции следующий: if<CR> command_1<CR> . . . last command<CR> .linthen<CR> command_1<CR> . . . last command<CR> else<CR> command_1<CR> . . . last command<CR> fi<CR>

С помощью этой конструкции вы можете усовершенствовать программу search, так что она будет сообщать вам и найденное слово и то, что слово не найдено. В этом случае программа search будет выглядеть следующим образом: $ cat search<CR> echo Type in the word and the file name. read word file if grep $word $file > /dev/null then echo $word is in $file else echo $word is NOT in $file fi $

Команда test

Команда test используется для организации цикла. Она проверяет на истинность определенные условия и полезна для организации условных конструкций. Если условие истинно, то цикл будет продолжен. Если условие ложно, то цикл завершится и будет выполняться следующая команда. Некоторые примеры использования команды test: test -r file<CR> истина, если файл существует и доступен для чтения; test -w file<CR> истина, если файл существует и доступен для записи; test -x file<CR> истина, если файл существует и является выполняемым; test -s file<CR> истина, если файл существует и имеет как минимум один символ; test var1 -eq var2<CR> истина, если var1 равно var2; test var1 -ne var2<CR> истина, если var1 не равно var2.

Пример. Создадим shell программу, которая перемещает все исполняемые файлы из текущего справочника в ваш справочник bin. Для этого воспользуемся командой test -x для выбора исполняемых файлов. Программа mv.file будет выглядеть следующим образом: $ cat mv.file<CR> echo type in the directory path read path for file do if test -x $file then mv $file $path/$file fi done $

Конструкция case ... esac позволяет выбрать вам один из несколько шаблонов и затем выполнить список команд для этого шаблона. Выражение-шаблон должно начинаться с ключевого слова in, а правая круглая скобка должна быть помещена после последнего символа каждого шаблона. Последовательность команд для каждого шаблона заканчивается двумя знаками ;;. Конструкция case должна быть закончена ключевым словом esac.

Общий формат конструкции case: case word<CR> in<CR> pattern1)<CR> command line 1<CR> . . . last command line<CR> ;;<CR> pattern2)<CR> command line 1<CR> . . last command line<CR> ;;<CR> pattern3)<CR> command line 1<CR> . . last command line<CR> ;;<CR> *)<CR> command line 1<CR> . . last command line<CR> ;;<CR> esac<CR>

Конструкция case пытается найти word с шаблоном pattern в первой секции шаблонов. Если поиск удачен, то программа выполняет командные строки после первого шаблона до соответствующих знаков ;;.

Если первый шаблон не найден, то осуществляется переход ко второму шаблону. Если любой шаблон найден, то программа не рассматривает остальные шаблоны, а переходит к команде, следующей за esac. Знак * используется как шаблон для поиска любого word и таким образом дает вам набор команд, который будет выполнен, если никакой другой шаблон не будет найден. Поэтому шаблон звездочка (*) размещается как последний шаблон в конструкции case, чтобы другие шаблоны были проверены первыми. Это поможет вам обнаружить некорректный и неожиданный ввод.

В шаблонах могут использоваться метасимволы *, ?, []. Это обеспечивает гибкость программ.

Рассмотрим пример. Программа set.term устанавливает переменную TERM в соответствии с типом терминала, который вы используете. Применяется следующая командная строка: TERM=terminal_name<CR>

Шаблон * стоит последним в списке шаблонов. Он выдает предупреждающее сообщение, что для указанного типа терминала нет соответствующего шаблона и позволяет вам завершить конструкцию case.

Пример. $ cat set.term<CR> echo If you have a TTY 4420 type in 4420 echo If you have a TTY 5410 type in 5410 echo If you have a TTY 5420 type in 5420 read term case term in 4420) TERM-T4 ;; 5410) TERM-T5 ;; 5420) TERM-T7 ;; *) echo not a correcr terminal type ;; esac export TERM echo end of programm $



Содержание раздела