Вы находитесь на странице: 1из 17

Правительство Российской Федерации

Федеральное государственное автономное образовательное


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

Московский институт электроники и математики Национального


исследовательского университета «Высшая школа экономики»

Департамент компьютерной инженерии

Лабораторный практикум

по курсу «Операционные системы»


для направления подготовки бакалавров 09.03.01 ИНФОРМАТИКА
И ВЫЧИСЛИТЕЛЬНАЯ ТЕХНИКА

Лабораторная работа №2

«Разработка командных процедур в ОС Unix»

Методические указания

Москва 2016г.
УДК 681.3

Фомин С.С. Разработка командных процедур в ОС Unix. Методические указания по


проведению лабораторной работы. – М.: МИЭМ, 2016. – 14с.

Приводятся сведения о командных интерпретаторах ОС Unix. Рассматриваются


высокоуровневые конструкции командного языка (условный оператор, операторы циклов,
оператор выбора) и примеры их использования в командных процедурах. Пособие позволяет
получить навыки создания командных процедур практически в любой реализации ОС Unix.
Предназначено для студентов, обучающихся по направлению «Информатика и
вычислительная техника» и слушателей курсов повышения квалификации.
Пособие носит практический характер и может быть использовано для
индивидуального обучения.

© МИЭМ НИУ ВШЭ, 2016


1. Цель лабораторной работы

Цель лабораторной работы – приобрести навыки разработки простейших командных


процедур на командном языке ОС Unix.

2. Интерпретаторы команд ОС Unix

В любой операционной системе существует командная оболочка (интерпретатор


команд), которая анализирует введенные команды и их аргументы, проверяет
синтаксис, допустимость тех или иных ключей и т.д. и запускает соответствующую
программу, т.е. создает в Unix процесс и передает ему управление.

Помимо исполнения команд интерпретатор команд выполняет и другие важные


работы:
· генерацию имён файлов;
· переназначение ввода и вывода;
· конвейеризацию;
· контроль среды окружения;
· интерпретацию и выполнение командных процедур.

3. Основные реализации командных интерпретаторов

Имеются 4 основных реализации командных интерпретаторов для ОС Unix:


· Bourne Shell (sh);
· C-Shell (csh);
· Korn Shell (ksh);
· Bourne Again Shell (bash).

Основным интерпретатором команд принято считать интерпретатор (и


соответственно командный язык) sh, который используется для записи командных
процедур загрузки Unix.

4. Аргументы командных процедур

Интерпретатор команд рассматривает командную строку следующим образом:

Командная строка состоит из «слов», разделенных пробелами. Первое слово


интерпретируется как имя программы, остальные слова – это аргументы команды.
Интерпретатор осуществляет поиск исполнимого файла (программы), имя которого совпадает
с именем команды, вызывает его и передаёт ему все относящиеся к нему параметры.

Примечание: символ % является подсказкой интерпретатора команд.

Если исполнимый файл является командной процедурой (командным файлом),


то интерпретатор будет просто читать файл и выполнять из него команды.
В командных процедурах аргументы кодируются особым образом:
· первому аргументу соответствует переменная $1;
· второму - $2 и т.д. до $9.
Эти переменные называются позиционными т.к. их номера соответствуют
номерам позиций аргументов. Обратите внимание на то, что всего существует 9
переменных, хранящих позиционные переменные.

В общем случае алгоритм обработки интерпретатором команд строк командной процедуры


следующий:
· интерпретатор читает очередную строку;
· выявляет метасимволы и переменные;
· производит необходимые замены и подстановки;
· после этого интерпретатор вызывает исполняемый файл, имя которого
совпадает с именем команды, и передает ему строку параметров.

5. Простейшая командная процедура (командный файл)

Пусть требуется перейти из домашнего каталога в каталог /bin, распечатать его


содержимое и вернуться назад.
Последовательность команд, которая решает эту задачу, выглядит следующим
образом:

% cd /bin
% ls –l | more
% cd

Запишем эту последовательность команд в файл с именем batch1.

Теперь можно вызвать интерпретатор командного языка Shell и передать ему в


качестве аргумента имя командного файла:

% sh batch1

Unix позволяет сделать из текстового файла batch1 настоящую программу


(команду). Для этого необходимо для файла batch1 установить в правах доступа
разрешение на выполнение:
% chmod +x batch1

Теперь этот командный файл можно вызывать на выполнение так же, как и другие команды –
по имени:

% batch1

Модифицируем командный файл batch1 так, чтобы можно было при вызове
командного файла указывать имя каталога, оглавление которого необходимо
распечатать, т.е. вызов командного файла должен выглядеть, например, так:

% batch1 /bin

где аргумент /bin задает имя каталога.

Заменим имя каталога /bin в первой строке командного файла batch1 на


позиционную переменную $1:

Позиционная переменная $1 является формальным параметром и интерпретатор


командного языка заменит его на фактический параметр – имя каталога, заданное в
качестве аргумента при вызове командной процедуры batch1.

В общем случае алгоритм обработки интерпретатором команд строк командной процедуры


следующий:
· интерпретатор читает очередную строку;
· выявляет метасимволы и переменные;
· производит необходимые замены и подстановки;
· после этого интерпретатор вызывает исполняемый файл, имя которого
совпадает с именем команды, и передает ему строку параметров.

6. Специальные параметры интерпретатора команд

Интерпретатор присваивает (автоматически) значения некоторым параметрам, обозначаемым


одним из следующих символов:
# - количество позиционных параметров;
* - значения позиционных параметров в виде строки "$1 $2 $3 …";
@ - значения позиционных параметров;
$- идентификатор текущего процесса (Shell-процесса);
? - десятичное значение, возвращаемое последней выполненной командой;
- - флаги, указанные при запуске Shell
!- идентификатор последнего запущенного процесса.

7. Команда test
Встроенная команда test интерпретатора команд sh используется в следующих
случаях:
· для сравнения строк и чисел;
· для проверки состояния файла;
· в операторе if.

Формат команды:

test <выражение>

Команда test вычисляет <выражение> и, если значение выражения - ИСТИНА, то


возвращает код завершения 0 (True); иначе – ненулевое значение (false).

7.1. Cравнение строк

Формат команды test для сравнения строк:

test строка1=строка2 # проверка на равенство


test строка1!=строка2 # проверка на неравенство

Пример_1: проверка на пустой аргумент команды

% test "$1"=""

7.2. Cравнение чисел

Формат команды test для сравнения чисел:

test число1 <оператор> число2

Операторы указываются в соответствии со следующей таблицей:

Наименование Математический Оператор в команде


оператора вид оператора test

равно ═ -eq
не равно ≠ -ne

меньше < -lt

меньше или равно ≤ -le

больше > -gt

больше или равно ≥ -ge

Пример_1: проверка кода возврата последней выполненной команды


на 0.

test "$?" -eq 0

Пример_2: проверка текущей даты на 20 число

test "`date +%d`" -eq 20

Здесь date +%d – команда получения текущей даты, в которой форматная строка
(+%d) ограничивает вывод команды только числом.

7.3. Проверка состояния файла

В случае использования команды test для проверки состояния файла


<выражение> может состоять из следующих примитивов:

-r файл - истина, если файл существует и доступен для чтения;


-w файл - истина, если файл существует и доступен для записи;
-x файл - истина, если файл существует и доступен для выполнения;
-f файл - истина, если файл существует и является обычным файлом;
-d файл - истина, если файл существует и является каталогом;
-c файл - истина, если файл существует и является специальным символьно-
ориентированным файлом;
-b файл - истина, если файл существует и является специальным блок-
ориентированным файлом.

8. Управляющие конструкции высокого уровня


8.1. Условный оператор (if)

Формат простого оператора if:

if условие
then
команда
команда
.......
fi

Если условие истинно (True), то команды, которые находятся между


служебными словами then и fi будут исполнены, в противном случае они будут
пропущены.

Примечание. (Использование команды test в операторе if).


Команда test часто используется в составе условного оператора в командных процедурах.

if test "`date + %d`" -eq 24


then
echo OK
fi

Условие представляет собой выражение, которое может быть заключено в квадратные скобки:
[условное_выражение]

Кроме того, в выражении могут применяться операторы –a (AND) и –o (OR):


[$i –gt 7 –a $i –le 99]

По сути, мы использовали команду test, однако применение квадратных скобок позволяет не указывать
имени команды.
Приведенное выражение будет верно только в том случае, если переменная i > 7 и i ≤ 99.

Формат расширенного оператора if:

if условие
then
команда
команда
.......
else
команда
команда
.......
fi

else
команда
команда
.......
fi

Пример_1: Командная процедура (назовём её who2), выводящая сведения о


работе в данный момент одного из зарегистрированных в системе пользователей.

if
who | grep "$1" > /dev/null
then
echo "$1 is logged on"
else
echo "$1 is not logged on"
fi

Запуск командной процедуры предполагает задание имени пользователя


в качестве параметра:

% who2 petrov

Если пользователь petrov работает в системе в момент запуска процедуры who2,


то будет выведено сообщение:

petrov is logged on (Петров зарегистрировался в системе)

в противном случае будет выведено сообщение:

petrov is not logged on (Петров не зарегистрировался системе)

В качестве условия в команде if используется конвейер из двух команд:


¨ who - выводит в стандартный вывод сведения о работающих в настоящее
время пользователях с указанием времени входа в систему;
¨ grep – пропускает на выход только те строки из вывода команды who, в
которых встречается заданный в качестве формального параметра $1 имени
пользователя.

8.2. Операторы цикла (for и while)

Все языки программирования включают механизм, который позволяет


многократно повторять группу операторов.

8.2.1. Оператор цикла for


Формат оператора цикла for:

for переменная in список


do
команда
команда
.......
done

Список команд, заключенный между ключевыми словами do . . . done


выполняется один раз для каждого значения из списка. При этом очередное
выбираемое значение из списка присваивается переменной, имя которой указано слева
от ключевого слова in.
Список значений может задаваться символьными константами и значением
некоторой переменной, содержащей последовательность, разбиваемую
разделителями.

Пример_1: Процедура print1 печатает (выводит в стандартный вывод) три файла,


перечисленные в списке значений цикла for.

for file
in otchet pismo spravka
do
echo "printing $file"
more "$file"
done

Пример_2: Процедура print2 печатает файлы, перечисленные в командной


строке (%print2 spravka otchet). В списке значений цикла for использована переменная
'*' (см. раздел 6), содержащая список позиционных параметров, т.е. имена файлов
spravka и otchet.

for file
in $*
do
echo "printing $file"
more "$file"
done

Пример_3: Процедура print3 печатает файлы, список которых получен


командой ls.

for file
in `ls`
do
echo "printing $file"
more "$file"
done

8.2.2. Оператор цикла while

Формат оператора цикла while:

while условие
do
команда
команда
.......
done

Оператор while повторяет заданную группу команд, если условие выполнения


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

Пример_1: Необходимо разработать командную процедуру, которая сравнивает содержимое


некоторого файла-образца с содержимым с другими файлами из списка и сообщает имя
первого файла, с которым образец не совпал.
Пусть эта процедура вызывается на выполнение так:

% cmplist file1 file2 file3 . . .

где – file1 – файл-образец;


file3 file3 . . . – файлы для сравнения.

Текст командной процедуры cmplist:

i=$1
while cmp $i $2
do
shift
done
echo $2

Процедура cmplist работает следующим образом. Сначала переменной i


присваивается значение первого позиционного параметра (это имя файла-образца).
Условие выполнения цикла while формируется командой cmp – сравнить файлы. У этой
команды два операнда – сравниваемые файлы. Если файлы совпали, команда cmp
вырабатывает код возврата «Истина» и выполняются команды из тела цикла (do . . .
done), в противном случае выполнение цикла завершается и выводится имя первого
файла, содержимое которого не совпало с содержимым файла-образца.
Тело цикла в данной командной процедуре на редкость простое и короткое. В
нем применена встроенная команда интерпретатора shift, которая сдвигает список
позиционных параметров влево на одну позицию. Сначала этот список выглядит
следующим образом:

$1 $2 $3 $4
file1 file2 file3

В трех первых позиционных параметрах разместились имена файлов, заданных


в качестве аргументов командной процедуры. После однократного выполнения
команды shift список параметров будет выглядеть так:

$1 $2 $3 $4
file2 file3

Таким образом, при первом выполнении командной процедуры сравнивались


файлы file1 и file2 (их имена находились в переменной i и втором позиционном
параметре). При втором выполнении цикла сравнивались уже файлы file1 и file3, и
имена этих файлов по-прежнему находились в переменной i и втором позиционном
параметре.

Пример_2: Разработаем командную процедуру (пусть она называется copy3),


которая читает строки со стандартного ввода и размещает их в файле dump. Ввод
прекращается, если введена строка, состоящая из одного символа 'q'. Пустые строки в
файл dump не записываются.

while
echo "Enter words [Type q, to quit]"
read line
do
if test "$line"="q"
then
break
fi
if test "$line"=""
then continue
else
echo "$line" >> dump
fi
done

Примечания. 1). Оператор break используется в циклах для досрочного выхода из цикла.
2). Оператор continue используется для пропуска команд до конца цикла. При этом
осуществляется переход на начало цикла.
3). Оператор if может быть записан без применения встроенной команды test с применением
квадратных скобок:
if ["$line"="q"]
8.3. Оператор выбора case

Оператор выбора case удобен для организации ветвления программы на основе


совпадения шаблонов (образцов).
Можно выполнить подобную операцию с помощью цепочки if-else if, но оператор
case короче, удобнее и нагляднее:

Формат оператора case:

case переменная
in
шаблон 1) команда
команда
.......
команда ;;
....................
шаблон N. команда
команда
.......
команда ;;
esac

Если значение переменной совпало со значением шаблона, то выполняются


команды, расположенные до символов ';;' , затем те, что после esac.

Пример_1: Командная процедура menu

echo "
1) ls
2) date
3) pwd
which function do you wish? \c"
read command
case "$command"
in
1) ls –Fc
;;
2) date
;;
*) echo not available
;;
esac

8.4. Арифметические операции с переменными Shell

Shell не предназначен для проведения арифметических операций с


числами. Параметры рассматриваются как строки. Однако для проведения операций с
целыми числами всё-таки существует встроенная команда expr.
В команде expr используются следующие арифметические операции:

+ - / * %
Команда expr посылает результат на стандартный вывод.

Примеры:

%expr 3 + 2
5

%expr 7 "*" 8 (или так: %expr 7 \* 8


56

%n=100
%expr $n + 1
101

Так как expr посылает результат на стандартный вывод, можно


использовать обратные апострофы, чтобы присвоить результат работы expr
переменной:

%i=`expr 3 + 2`
echo $i
5

%n=100
%n=`expr $n + 1
echo $n
101

8.5 Стандартные переменные Shell


Некоторые имена переменных зарезервированы в Shell для специальных
целей.
Вот некоторые из них:

HOME каталог, в который пользователь попадает при входе


в систему или при выполнении команды cd без аргументов;
LOGNAME регистрационное имя пользователя;
PATH список полных имен каталогов, в которых
производится поиск файла при указании его неполного имени;
IFS последовательность символов, являющихся
разделителем в командной строке;
TERM тип терминала;
PS1 первичное приглашение интерпретатора команд
(для интерпретатора sh это - '$'; для csh -'%');
PS2 вторичное приглашение (по умолчанию - '>'). В
интерактивном режиме перед вводом команды интерпретатор выводит
первичную подсказку. Если нажата клавиша Enter, но для завершения
команды требуется дальнейший ввод, то выводится вторичное
приглашение.

Примечание. Список стандартных переменных и переменных, определенных пользователем,


можно вывести по команде set.

Пример_1: ввод с клавиатуры командной процедуры, состоящей из нескольких


строк:

%for n in 1 2 3
>do # продолжение ввода
>echo $n # командной процедуры
>done # после вторичной подсказки
1
2
3
%

Пример_2: модификация стандартной переменной:

%HOME=/usr/home/mydir
%PS2="=>"

Пример_3: к значению переменной PATH можно добавить новый каталог:

PATH=$PATH:/home/mydir
Задание по лабораторной работе:

· ввести несколько переменных и присвоить им значения;


· просмотреть значения всех введенных переменных (встроенная команда set);
· создать простейшую командную процедуру, в которой используется значение
позиционных параметров;
· ввести и отладить командные процедуры: print3, cmplist, copy3, menu;
· модифицировать процедуру print3 так, чтобы она выводила на стандартный
вывод только текстовые файлы;
· модифицировать процедуру cmplist так, чтобы она правильно работала в случае,
когда все сравниваемые файлы одинаковы;
· модифицировать стандартные переменные sh (PS1, PS2, PATH);
· проанализировать управляющий командный файл (.profile) в домашнем
каталоге и каталоге /etc;
· просмотреть стартовый командный файл /etc/rc и конфигурационный командный
файл /etc/rc.conf;
· опробовать ввод командных процедур в интерактивном режиме.

Отчет о работе

Выполните задания лабораторного практикума и продемонстрируйте


результаты работы преподавателю. Разработайте две командные процедуры,
подготовьте отчёт о работе.

Литература

1). А.Робачевский. ОС Unix. BHV, С-Петербург, 1997, 515с.


2). П.Кью. Использование Unix. Специальное издание. 3-е изд.: Пер. с англ. - М., С-
Пб.,К.: Издат. дом "Вильямс", 1999. - 624 с.
3). К.Рейчард, Э.Фостер-Джонсон. Unix: справочник – С-Пб.: Петер Ком, 1998. - 384 с.

Оглавление
1. Цель лабораторной работы.. 3
2. Интерпретаторы команд ОС Unix. 3
3. Основные реализации командных интерпретаторов. 3
4. Аргументы командных процедур. 4
5. Простейшая командная процедура (командный файл) 5
6. Специальные параметры интерпретатора команд. 6
7. Команда test 7
7.1. Cравнение строк. 7
7.2. Cравнение чисел. 7
7.3. Проверка состояния файла. 8
8. Управляющие конструкции высокого уровня. 9
8.1. Условный оператор (if) 9
8.2. Операторы цикла (for и while) 11
8.2.1. Оператор цикла for 11
8.2.2. Оператор цикла while. 12
8.3. Оператор выбора case. 15
8.4. Арифметические операции с переменными Shell 16
8.5 Стандартные переменные Shell 17
Задание по лабораторной работе: 19
Отчет о работе. 19
Литература. 19