Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторная ОС_3.doc
Скачиваний:
18
Добавлен:
13.03.2016
Размер:
117.25 Кб
Скачать

Лабораторная работа № 3 Изучение командного интерпретатора unix Shell

Цель работы:ознакомление с базовыми правилами создания и применения командных скриптов вUnix.

Краткий обзор:

Командный интерпретатор Shellэто обычная прикладная программа, выполняющая команды пользователя, задаваемые либо в интерактивном (диалоговом) режиме, либо в виде командных файлов, называемых такжескриптами.

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

Базовой конструкцией языка shell является простая команда. Она состоит из имени команды и, если это необходимо, параметров, разделенных пробелами. Имя команды – это обычно имя исполняемого файла (либо двоичной программы, либоShell-скрипта).

Перенаправление ввода/вывода

Большинство команд UNIX выводят результат своей работы в текстовом виде на устройство стандартного вывода. По умолчанию это означает, что результаты выводятся на монитор пользователя. Однако стандартный вывод легко может быть перенаправлен в файл или на устройство. Для этого в команде используются символы ‘>’ и ‘>>’.

Например, если набрать в командной строке команду:

man cp > 1.txt,

справка по команде cp будет записана в файл 1.txt, при этом файл 1.txt будет создан заново, даже если файл с таким именем уже существует. Если же выполнить команду:

man cp >> 1.txt,

справка по команде cp будет дописана в конец существующего файла 1.txt.

Многие команды используют также стандартный ввод (хэндл 0), который по умолчанию означает данные, вводимые с клавиатуры терминала. Признаком конца ввода служит комбинация Ctrl+D. Стандартный ввод также может быть перенаправлен для чтения данных из файла или с устройства (с помощью символа ‘<’), или даже непосредственно из текста команды.

Для выполнения команды shell запускает отдельный процесс. Результатом выполнения команды является код завершенияпроцесса, который может затем быть проанализирован. Нулевое значение кода обычно означает нормальное завершение, значение, большее нуля – ошибку.

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

Конвейерозначает параллельное выполнение нескольких команд с передачей данных по мере их обработки от одной команды к следующей. Запись конвейера состоит из нескольких команд, разделенных знаками ‘|’. Для выполнения конвейера шелл запускает одновременно процессы для каждой команды, при этом стандартный вывод каждой команды перенаправляется на стандартный ввод следующей.

Например, если необходимо вывести содержимое файла big_text:

cat big_text,

но в нем много строк и пользователь не успеет его прочитать, целесообразно отправить вывод команды cat какой-то программе, которая будет выводить его постранично:

cat big_text | more

Списокозначает последовательное выполнение команд. Он состоит из нескольких команд, разделенных знаками ‘;’, ‘&&’ или ‘||’. Если две команды разделены знаком ‘;’, то следующая команда запускается после завершения предыдущей. Если команды разделены знаком ‘&&’, то следующая будет выполняться только в том случае, если код завершения предыдущей равен 0 (нормальное завершение). Напротив, знак ‘||’ означает, что следующая команда будет выполняться только в том случае, если код завершения предыдущей не равен 0 (завершение с ошибкой).

Если запись команды заканчивается символом ‘&’, то Shell запускает процесс ее выполнения в фоновом режиме, т.е. не дожидается завершения процесса, а переходит к следующей команде. При этом фоновый процесс продолжает работать параллельно с командным интерпретатором и запускаемыми им другими командами. Фоновый процесс не имеет доступа к терминалу.

Создание сценариев на языке оболочки shell

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

Использование переменных

Как при интерактивной работе, так и при выполнении скриптов могут определяться и использоваться переменные, имеющие строковые значения. Имя переменной может быть последовательностью букв, цифр и знака подчеркивания, начинающейся с буквы или знака подчеркивания. Для присваивания значений переменным может использоваться оператор присваивания "=". При необходимости присвоить Shell-переменной значение, содержащее пробелы и другие специальные знаки, оно заключается в кавычки. Например:

var_1=13 # "13" - это не число, а строка из двух цифр.

var_2="ОС UNIX" # здесь двойные кавычки необходимы, так как в строке есть пробел.

Обратите внимание, что переменная и ее значение должны быть записаны без пробелов относительно символа "=".

Для получения значения переменной перед ее именем записывается символ ‘$’.

echo $var_1 # вывод значения переменной $var_1

Также значение переменной можно прочитать с клавиатуры:

read var_1

В скриптах можно также использовать значения параметров, с которыми был

вызван скрипт, они обозначаются от $1до$9.

В последовательности символов те из них, которые составляют имя переменной, должны быть выделены в { } или " ". Кроме того, интерпретатор Shell автоматически присваивает значения пяти своим переменным:

    1. $? – код возврата последней выполненной команды;

    2. $$ - идентификационный номер процесса Shell;

    3. $! - идентификационный номер фонового процесса, запущенного интерпретатором Shell последним;

    4. $# - число аргументов, переданных в командной строке Shell;

    5. $- - флаги, переданные в Shell.

Как во всяком языке программирования в тексте на языке shell могут быть комментарии. Для этого используется символ "#". Все, что находится в строке (в командном файле) левее этого символа, воспринимается интерпретатором как комментарий. Если строка помещается в обратные кавычки, значит она является командой, которая будет выполнена, например:

now = `date` (где `` - обратные кавычки)

echo $now

Sun Feb 14 12:00:01 PST 1985