- •Московский институт электроники и математики
- •«Разработка командных процедур в ос Unix»
- •1. Цель лабораторной работы
- •2. Интерпретаторы команд ос Unix
- •3. Основные реализации командных интерпретаторов
- •4. Аргументы командных процедур
- •5. Простейшая командная процедура (командный файл)
- •6. Специальные параметры интерпретатора команд
- •7. Команда test
- •7.1. Cравнение строк
- •7.2. Cравнение чисел
- •7.3. Проверка состояния файла
- •8. Управляющие конструкции высокого уровня
- •8.1. Условный оператор (if)
- •8.2. Операторы цикла (for и while)
- •8.2.1. Оператор цикла for
- •Пример_1: Процедура print1 печатает (выводит в стандартный вывод) три файла, перечисленные в списке значений цикла for.
- •8.2.2. Оператор цикла while
- •8.3. Оператор выбора case
- •8.4. Арифметические операции с переменными Shell
- •8.5 Стандартные переменные Shell
- •Отчет о работе
- •Библиографический список
5. Простейшая командная процедура (командный файл)
Пусть требуется перейти из домашнего каталога в каталог /bin, распечатать его содержимое и вернуться назад.
Последовательность команд, которая решает эту задачу, выглядит следующим образом:
%cd /bin
%ls –l | more
%cd
Запишем эту последовательность команд в файл с именем batch1.
Теперь можно вызвать интерпретатор командного языка Shellи передать ему в качестве аргумента имя командного файла:
%shbatch1
Unixпозволяет сделать из текстового файлаbatch1 настоящую программу (команду). Для этого необходимо для файлаbatch1 установить в правах доступа разрешение на выполнение:
%chmod+xbatch1
Теперь этот командный файл можно вызывать на выполнение так же, как и другие команды – по имени:
%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"$?" -eq0
Пример_2: проверка текущей даты на 20 число
test "`date +%d`" -eq 20
Здесь date+%d– команда получения текущей даты, в которой форматная строка (+%d) ограничивает вывод команды только числом.