Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Операционные системы_пособие.doc
Скачиваний:
33
Добавлен:
03.05.2015
Размер:
353.79 Кб
Скачать

4.3. Контрольные вопросы

  1. Перечислите основные утилиты для обработки текстов.

  2. Назначение утилиты grep.

  3. Что такое регулярное выражение и для чего оно предназначено?

  4. Назначение утилит headиtail.

  5. Назначение утилиты cut.

  6. Назначение утилиты sort.

  7. Возможности потокового редактораsed.

  8. Приведите примеры использования команд для обработки текста.

5. Программирование на языке командного интерпретатора

5.1. Командные интерпретаторы

В предыдущих лабораторных работах взаимодействие с операционной системой FreeBSDосуществлялось с помощью командного интерпретатораBourneShell. Он является самым распространенным, но не единственным. Существует еще несколько интерпретаторов, например С shell,Kornshell,Tshellи др. ВLinuxнаибольшее распространение получил интерпретаторBourne-Againshell. Главным отличием этих командных интерпретаторов для пользователя является их синтаксис.

Shell-интерпретаторы являются также и языками программирования, которые применяется для написания командных файлов (shell - файлов). Командные файлы также называютсяскриптамиилисценариями.

5.2. Синтаксис языка Bourne shell

Общий синтаксис скрипта

Скрипт представляет собой обычный текстовый файл, в котором записаны инструкции, понятные командному интерпретатору. Это могут быть команды, выражения shell или функции. Командный интерпретатор считывает эти инструкции из файла и последовательно выполняет их.

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

#! /bin/sh

В данном случае последующий текст скрипта будет интерпретироваться Bourne shell. При запуске файла-скрипта из командной строки, он должен обладать правом на выполнение — х, при этом будет запущен новый командный интерпретатор, ввод команд для которого будет выполняться из файла скрипта.

Простые переменные

В командной строке или скрипте командного интерпретатора можно определить и использовать переменные. Значением переменной является строка, которая передается присвоением:

var = value,

где var— имя переменной, avalueее значение.

Значение переменной можно получить, используя знак $. Например, вывести значение переменной name на экран можно с помощью командыechoследующим образом:

$ echo $name

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

$ z=1000

$ х= $z

$ есhо $х

1000

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

$ var = `command`,

где var— имя переменной, acommand — название команды. Например:

$ dir = `pwd`

$ echo $cdir

/usr/home/user

Позиционные переменные

Помимо переменных, определяемых явно, shell имеет ряд внутренних переменных, значения которых устанавливаются самим интерпретатором.

Эти переменные приведены в табл. 5.1.

Таблица 5.1.

$1, $2,...

Позиционные параметры скрипта

$#

Число позиционных параметров скрипта

$?

Код возврата последнего выполненного процесса

$$

Идентификатор процесса (PID) текущего shell

$!

PIDпоследнего процесса, запущенного в фоновом режиме

$*

Все параметры, переданные скрипту. Передаются как единое слово, заключенное в кавычки: “$*” = “$1, $2, . . .”

$@

Все параметры, переданные скрипту. Передаются как отдельные слова, заключенные в кавычки: “$*” = “$1, $2, . . .”

Эти переменные редко используются при работе в командной строке, основная область их применения — скрипты. Например:

Текст скрипта test1.sh Запуск скрипта

# !/bin/sh $ ./test1.sh a1 a2 a3

echoscript$0script./test1.sh

echo$1 $2 $3a1a2a3

Значение $# равно числу позиционных параметров. Его удобно использовать при проверке соответствия числа введенных пользователем параметров требуемому.

Текст скрипта test2.sh Запуск скрипта

# !/bin/sh $ ./test2.sh

if [ $# -lt 2 ] usage: ./test1.sh arg1 arg2

echo usage: $0 arg1 arg2

exit 1

fi

В данном примере использовано условное выражение if и проверка, которые, будут рассмотрены ниже.

Текст скрипта test3.sh

grep user /etc/passwd #поиск слова user в файле паролей

if [ $? -ne 0 ]

then

echo пользователь user в системе не зарегистрирован

fi

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

Каждая запущенная из командного интерпретатора программа получает три открытых потока ввода/вывода:

  1. стандартный ввод;

  2. стандартный вывод;

  3. стандартный вывод ошибок.

По умолчанию ввод осуществляется с клавиатуры терминала, а вывод программы, включая сообщения об ошибках, будет происходить на экран терминала. Shell позволяет перенаправлять потоки ввода/вывода. Например, можно подавить вывод сообщений об ошибках, установить ввод или вывод из файла и передать вывод одной программы на ввод другой. В табл. 5.2 приведен синтаксис основных операторов перенаправления ввода/вывода.

Таблица 5.2.

>file

Перенаправление стандартного потока вывода в файл file.

>>file

Добавление в конец файла file данных из стандартного потока вывода.

<file

Получение стандартного потока ввода из файла file.

p1|р2

Передача стандартного потока вывода программы р1 в поток ввода р2 (конвейер). Используется для построения цепочек команд.

Пример:

$ cat file1 > file2– Вывод содержимого файлаfile1 вfile2;

$ cat file1 > file2– Добавление в конец файлаfile2 содержимого файлаfile1;

$ cat /etc/passwd | grep user– поиск пользователяuserв файле паролей;

$ grep user /etc/passwd > file1– добавление данных о пользователеuserв файлfile1.

Арифметические операции

Команда expr(express -- выражать) вычисляет выражение и записывает результат в стандартный вывод. Элементы выражения разделяются пробелами; символы, имеющие специальный смысл в командном языке, нужно экранировать. Строки, содержащие специальные символы, заключают в апострофы. Используя командуexpr, можно выполнять сложение, вычитание, умножение, деление, взятие остатка, сопоставление символов.

Примеры:

b=190

a=` expr 200 - $b` #вычитание

d=` expr $a + 125 "*" 10` # умножение, сложение

c=` expr $d % 13` # взятие остатка от деления

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

Ниже приведен пример сопоставления символов (:) с указанием числа совпадающих символов:

concur=` expr "abcdefgh" : "abcde"`

echo $concur

ответ 5.

Встроенные команды

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

cd [dir]- назначение текущего каталога;

exec [cmd [arg...]] <имя файла>- выполнение команды, заданной аргументами cmd и arg, путем вызова соответствующего выполняемого файла.

eval [ -arg]- вычисление и выполнение команды;

sh <filename.sh>выполнение командного файлаfilename.sh;

exit [n]- приводит к прекращению выполнения программы, возвращает код возврата, равный нулю, в вызывающую программу;

export [name [=word]...]- включение в среду. Командаexportобъявляет, что переменные name будут включаться в среду всех вызываемых впоследствии команд;

read name- команда вводит строку со стандартного ввода и присваивает прочитанные слова переменным, заданным аргументами name.

Условные выражения

Условный оператор ifимеет следующий формат:

if условие

then

command1

command2

else

command3

command4

fi

Команда test(проверить) используется с условным операторомifи операторами циклов. Действия при этом зависят от кода возвратаtest.Testпроводит анализ файлов, числовых значений, цепочек символов. Нулевой код выдается, если при проверке результат положителен, ненулевой код при отрицательном результате проверки.

В случае анализа файлов синтаксис команды следующий:

test [ -rwfds] file

где

-r– файл существует и его можно прочитать (код завершения 0);

-w– файл существует и в него можно записывать;

-f– файл существует и не является каталогом;

-d– файл существует и является каталогом;

-s– размер файла отличен от нуля.

Например, приведем фрагмент скрипта, проверяющего наличие новой почты в почтовом ящике пользователя

if [ test -s $MAIL ]

then

echo "Пришла почта"

fi

При анализе числовых значений команда testпроверяет, истинно ли данное отношение, например, равны ли А и В. Сравнение выполняется в формате:

-eq А = В

-ne А <> B

test A -ge B эквивалентно А >= В

-le А <= В

-gt А > В

-lt А < В

Отношения слева используются для числовых данных, справа – для символов.

Более сложные выражения могут быть образованы с помощью логических операторов:

! выражениеОператор НЕ

выражение –а выражениеОператор И

выражение –o выражениеОператор ИЛИ

Пример:

Фрагмент скрипта, анализирующий ввод имени пользователя, сохраненный в переменной ANSW. Если пользователь ввел ″N″ или ″n″, то скрипт завершает свою работу.

if [ ″ANSW″ = ″N″ -о ″ANSW″ = ″n″ ]

then

exit

fi

Циклы

Язык программирования Bourne shell имеет несколько операторов цикла.

while условие

do

command1

command2

done

С помощью оператора while командыcommand1, command2 и т. д. будут выполняться, покаусловиене станет ложным. Как и в случае с операторомif, условие генерируется кодом возврата командыtest.

until условие

do

command1

command2

done

В случае оператора until команды командыcommand1, command2 и т. д. будут выполняться, покаусловиене станет истинным.

Программный цикл может быть размещен внутри другого цикла (вложенный цикл). Оператор break прерывает ближайший к нему цикл. Если в программу ввести операторbreak с уровнем 2 (break 2), то это обеспечит выход за пределы двух циклов и завершение программы. Операторcontinueпередает управление ближайшему в цикле операторуwhile.

Оператор цикла с перечислением for:

for var in список

do

command1

command2

done

Оператор for обеспечивает выполнение цикла столько раз, сколько слов всписке. При этом переменнаяvar последовательно принимает значения, равные словам из списка. Список может формироваться различными способами, например как вывод некоторой команды или с помощью шаблонов shell.

Пример:

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

for dir in /tmp /usr/tmp /home/tmp

do

find $dir ! -type d –atime +7 –exec rm{}

done

Ветвление

Команда caseобеспечивает ветвление по многим направлениям в зависимости от значений аргументов команды. Формат:

case слово in

шаблон1)

command ;;

шаблон2)

command ;;

*)

command ;;

esac

Значение слово сравнивается с шаблонами, начиная с первого. Если совпадение найдено, то выполняются команды соответствующего раздела, который заканчивается двумя символами ';'. Если совпадения с другими шаблонами не произошло, то будут выполняться команды раздела '*)'.

Пример:

echo -n 'Please, write down your age'

read age

case $age in

test $age -le 20) echo 'you are so young' ;;

test $age -le 40) echo 'you are still young' ;;

test $age -le 70) echo 'you are too young' ;;

*) echo 'Please, write down once more'

esac