Операционная система UNIX - Робачевский Андрей Михайлович
Шрифт:
Интервал:
Закладка:
command
...
;;
<i>шаблон2</i>)
command
...
;;
*)
command
...
;;
esac
Значение <i>слово</i> сравнивается с шаблонами, начиная с первого. Если совпадение найдено, то выполняются команды соответствующего раздела, который заканчивается двумя символами ';'. Шаблоны допускают наличие масок, которые были рассмотрены нами в разделе "Подстановки, выполняемые командным интерпретатором". Раздел с шаблоном '*' аналогичен разделу default в синтаксисе селектора switch языка С: если совпадения с другими шаблонами не произошло, то будут выполняться команды раздела '*)'. В качестве примера использования селектора приведем скрипт запуска и останова системы печати в SCO UNIX.
state=$1
set `who -r`
case $state in
'start')
if [ $9 = "2" -o $9 = "3" ]
then
exit
fi
[ -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/sh
echo "input: "
while read var1 var2 var3
do
echo var1=$var1
echo var2=$var2
echo var3=$var3
echo "input: "
done
Запуск скрипта
$ <b>test5.sh</b>
input: <b>пример работы команды read</b>
var1=пример
var2=работы
var3=команды read
input: <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> Задание, на которое можно уникально указать префиксом <i>pref</i>, например, команда ls(1), запущенная в фоновом режиме, адресуется заданием %ls