- •Федеральное агенство связи
- •1. Использование командного интерпретатора для работы с файлами
- •1.1. Структура файловой системы FreeBsd
- •1.2. Работа с файлами
- •1.2.1. Работа с обычным текстовым файлом
- •1.2.2. Работа с каталогами
- •1.2.3. Работа со ссылками
- •1.3. Задание на лабораторную работу
- •4. Контрольные вопросы
- •2. Архивирование и сжатие файлов
- •2.1. Архивирование
- •2.2. Cжатие файлов
- •2.3. Задание на лабораторную работу
- •2.4. Контрольные вопросы
- •3. Управление учётными записями пользователей и правами доступа к файлам
- •3.1. Концепция пользователей и групп
- •3.2. Учетные записи пользователей
- •3.3. Группы пользователей
- •3.4. Владельцы файлов и права доступа к файлам
- •3.5. Задание на лабораторную работу
- •3.6. Контрольные вопросы
- •4. Использование команд для фильтрации и обработки текстов
- •4.1. Основные команды
- •4.3. Контрольные вопросы
- •5. Программирование на языке командного интерпретатора
- •5.1. Командные интерпретаторы
- •5.2. Синтаксис языка Bourne shell
- •5.3. Задание на лабораторную работу
- •5.4. Контрольные вопросы
- •6. Мониторинг производительности, управление процессами и автоматизация заданий
- •6.1. Мониторинг производительности
- •6.2. Управление процессами
- •6.3. Запуск заданий по расписанию
- •6.4. Задание на лабораторную работу
- •7. Монтирование файловых систем и мониторинг их использования
- •7.1. Монтирование и демонтирование файловых систем
- •7.2. Мониторинг использования файловых систем
- •6.4. Задание на лабораторную работу
- •7.4. Контрольные вопросы
- •8. Установка и настройка операционной системыFreeBsd
- •8.1. Установка и настройка виртуальной машины
- •8.2. Установка и настройка FreeBsDна виртуальной машине
- •8.3. Задание на лабораторную работу
- •8.4. Контрольные вопросы
- •Список литературы
- •Содержание
4.3. Контрольные вопросы
Перечислите основные утилиты для обработки текстов.
Назначение утилиты grep.
Что такое регулярное выражение и для чего оно предназначено?
Назначение утилит headиtail.
Назначение утилиты cut.
Назначение утилиты sort.
Возможности потокового редактораsed.
Приведите примеры использования команд для обработки текста.
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
Перенаправление ввода/вывода
Каждая запущенная из командного интерпретатора программа получает три открытых потока ввода/вывода:
стандартный ввод;
стандартный вывод;
стандартный вывод ошибок.
По умолчанию ввод осуществляется с клавиатуры терминала, а вывод программы, включая сообщения об ошибках, будет происходить на экран терминала. 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