Операционная система UNIX
command...;;<i>шаблон2</i>)command...;;*)command...;;esacЗначение
сравнивается с шаблонами, начиная с первого. Если совпадение найдено, то выполняются команды соответствующего раздела, который заканчивается двумя символами ';'. Шаблоны допускают наличие масок, которые были рассмотрены нами в разделе "Подстановки, выполняемые командным интерпретатором". Раздел с шаблоном '*' аналогичен разделу default в синтаксисе селектора switch языка С: если совпадения с другими шаблонами не произошло, то будут выполняться команды раздела '*)'. В качестве примера использования селектора приведем скрипт запуска и останова системы печати в SCO UNIX.<i>слово</i>state=$1set `who -r`case $state in'start')if [ $9 = "2" -o $9 = "3" ]thenexitfi[ -f /usr/lib/lpshed ] && /usr/lib/lpshed;;'stop')[ -f /usr/lib/lpshut ] && /usr/lib/lpshut;;*)echo "usage $0 start|stop";;esacВ случае, когда скрипт вызван с параметром
, будет произведен запуск системы печати. Если параметр скрипта —start, то система печати будет остановлена. Запуск скрипта с любым другим параметром приведет к выводу сообщения об ошибке.stopВвод
Как мы уже видели, присвоение значений переменным может осуществляться явно или с помощью вывода некоторой программы. Команда read предоставляет удобный способ присвоить переменным значения, считанные из стандартного потока ввода. Это может быть строка, введенная пользователем или считанная из файла в случае перенаправления потока.
Команда read считывает строку из стандартного потока ввода и последовательно присваивает переменным, переданным в качестве параметров, значения слов строки. Если число слов в строке превышает число переменных, то в последней переменной будут сохранены все оставшиеся слова. Продемонстрируем это на простом примере:
Текст скрипта test5.sh:
#!/bin/shecho "input: "while read var1 var2 var3doecho var1=$var1echo var2=$var2echo var3=$var3echo "input: "doneЗапуск скрипта
$ <b>test5.sh</b>input: <b>пример работы команды read</b>var1=примерvar2=работыvar3=команды readinput: <b>еще пример</b>var1=ещеvar2=примерvar3=input: <b>^D</b>$В приведенном примере read в цикле считывает пользовательский ввод. Цикл завершается, когда достигнут конец файла (что эквивалентно пользовательскому вводу <Ctrl>+<D>), поскольку при этом read возвращает неудачу (код возврата равен 1) и while завершает работу. В первом цикле число введенных слов превышает количество переменных, поэтому значение переменной
состоит из двух слов. Во втором цикле значениеvar3пусто.var3Система управления заданиями
Командный интерпретатор может поддерживать управление заданиями. Для Bourne shell (/bin/sh), который мы рассматриваем, систему управления заданиями включает парный ему интерпретатор /bin/jsh. В остальном этот интерпретатор имеет те же возможности.
В системе управления заданиями каждая команда (простая или составная), которую пользователь запускает со своего терминала, называется заданием. Все задания могут выполняться либо в текущем режиме, либо в фоновом режиме, либо быть приостановлены. Задание в каждом из этих состояний обладает рядом характеристик:
Состояние задания Характеристики Выполняется в текущем режиме Задание может считывать данные и выводить данные на терминал пользователя Выполняется в фоновом режиме Заданию запрещен ввод с терминала. Возможность вывода на терминал определяется дополнительными установками Приостановлено Задание не выполняется Каждое задание при запуске получает уникальный идентификатор, называемый номером задания, который используется в командах системы управления. Синтаксис номера задания, применяемый в командах:
%<i>jobid</i>где
может принимать следующие значения:<i>jobid</i>
или%+Текущее задание — самое последнее запущенное или вновь запущенное задание -Предыдущее задание (по отношению к текущему) ?<i>строка</i>Задание, для которого присутствует в командной строке запуска<i>строка</i>nЗадание с номером n <i>pref</i>Задание, на которое можно уникально указать префиксом , например, команда ls(1), запущенная в фоновом режиме, адресуется заданием %ls<i>pref</i>