Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Забродин УНИХ основы командного интерфейса 2010

.pdf
Скачиваний:
160
Добавлен:
16.08.2013
Размер:
1.33 Mб
Скачать

Здесь символ * имеет смысл <список_имен_файлов_текущего_ каталога>.

Пример процедуры PROC, выводящей на экран имена файлов из текущего каталога, число символов в имени которых не превышает заданного параметром числа:

if [ “$1” = “” ] then

exit

fi

for nam in * do

size = `expr $nam : ‘.*’` if [ “$size” –le “$1” ]

then echo “Длина имени $nam $size символа”

fi

done

Вывод содержимого текущего каталога для проверки работы процедуры:

$ ls –l total 4

drwxrwxrwx 2 lev lev 1024 Feb 7 18:18 dir1 -rw-rw-r-- 1 lev lev 755 Feb 7 18:24 out -rwxr-xr-x 1 lev lev 115 Feb 7 17:55 f1 -rwxr-xr-x 1 lev lev 96 Feb 7 18:00 f2

$

Результаты работы процедуры: $ PROC 2

Длина имени f1 2 символа Длина имени f2 2 символа $PROC 3

Длина имени out 3 символа Длина имени f1 2 символа Длина имени f2 2 символа

$

111

Пример. Процедура с именем PR выводит на экран из указанного параметром подкаталога имена файлов с указанием их типа.

cd $1

for fil in * do

If [ -d $fil]

then echo “$fil – catalog” else echo “$fil – file”

fi done

Вывод содержимого подкаталога для проверки работы процедуры:

$ ls –l pdir total 4

drwxrwxrwx 2 lev lev 1024 Feb 7 18:18 dir1

-rw-rw-r--

1

lev

lev

755

Feb

7

18:24

out

-rwxr-xr-x

1

lev

lev

115

Feb

7

17:55

f1

-rwxr-xr-x

1

lev

lev

96

Feb

7

18:00

f2

Результаты работы процедуры: $ PR pdir

dir1 – catalog out – file

f1 – file

f2 – file

$

Пример циклической процедуры, которая сортирует строки исходных файлов и переписывает отсортированное содержимое исходных файловв новые файлыс чпастично совпадающими именами:

for i in f1 f2 f3 do

cat $i|sort>${i}_rez

#отсортированные тексты перепишутся в файлы

#f1-rez, f2-rez, f3-rez

done

112

Некоторые дополнительные команды, которые могут быть использованы в процедурах:

sleep t приостанавливает выполнение процесса на t секунд.

Пример. Бесконечная (циклическая) процедура выводит каждые пять секунд сообщение в указанный файл fil:

while true do

echo “текст_сообщения”>fil sleep 5

done

Примечания: 1. Вместо файла (или экрана) может быть использовано фиктивное устройство /dev/null (например, для отладки процедуры).

2. В процедуре реализуется бесконечный цикл. Для ограничения числа циклов надо предусмотреть счетчик циклов (см. выше) или прекратить выполнение процесса процедуры с помощью команды управления процессами $kill (см. ниже).

exit [n] прекращение выполнения процедуры с кодом за-

вершения [n] или с кодом завершения последней выполненной команды.

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

Вопросы для самоконтроля

1.Понятие кодов завершения выполнения команд. Средства анализа кодов. Примеры.

2.Результаты проверки файлов, сравнения числовых значений

исимвольных строк. Как анализируются результаты и для каких целей используются? Примеры.

3.Механизм выработки и проверки условий в shell-процедурах.

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

5.Средства ветвления вычислительных процессов в shellпроцедурах. Семантика конструкции. Пример.

6.Средства проверки условий и организации циклов типа «пока истина» в процедурах. Семантика конструкции. Пример.

7.Средства проверки условий и организации циклов типа «пока ложь»l в процедурах. Семантика конструкции. Пример.

8.Средства проверки условий и организации циклов с перебором списка переменных в процедурах. Семантика конструкции. Пример.

113

9. СОЗДАНИЕ И РЕДАКТИРОВАНИЕ ТЕКСТОВЫХ ФАЙЛОВ И ПРОЦЕДУР

Во всех версиях ОС UNIX имеется встроенный текстовый редактор vi экранного типа. Он может применяться практически на любом терминале, начиная с телетайпа. Редактор является универсальным средством, доступным в среде любой UNIX-подобной ОС.

9.1. КОМАНДЫ И РЕЖИМЫ РАБОТЫ С РЕДАКТОРОМ VI

Экранный текстовый редактор vi в настоящее время является неотъемлемой частью любой операционной системы семейства UNIX. Кроме того, он часто используется в качестве редактора командной строки в современных версиях shell.

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

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

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

В начале редактирования при вызове редактора командой vi включается командный режим. В дальнейшем пользователь может переходить из режима в режим, выполняя определенные команды, а именно: для перехода из командного режима в режим ввода – команды i, I, a, A, o, O; для перехода из режима ввода в командный режим – команду ESC, для перехода из командного режима в режим последней строки – команды ?, /, :, для перехода из режима последней строки – команду ENTER. В режиме последней строки вызывается строковый редактор ex, команды которого отображаются на экране.

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

114

версии редактора vi поддерживают перемещение курсора с помощью специальных клавиш клавиатуры (Left, Right, Up, Down), тем самым избавляя пользователя от необходимости применять соответствующие команды редактора.

Для ускорения редактирования каждая команда редактора может выполняться многократно в соответствии с коэффициентом повторения (числом, вводимым перед соответствующей командой).

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

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

Начало работы с редактором:

$vi имя_файла [*] — вызов редактора и файла. Если файл не существует, то создается новый пустой.

Редактируемый файл переписывается в буфер. Далее все изменения в редактируемом файле соответственно осуществляются в буфере в КОМАНДНОМ РЕЖИМЕ — нажатые клавиши интерпретируются как команды редактирования текста. В командный режим редактор переводится автоматически сразу же после входа в программу vi.

По завершении редактирования надо выйти из редактора с сохранением файла:

<Esc>:wq! отредактированная копия замещает исходный файл. Если же требуется отменить все редактирование, то:

<Esc>:q!

В режиме редактирования, например для ввода новых фрагментов текста файла, используются клавиши команды режима ввода текста (значения клавиш на экране не отображается):

a (append) — набор последующего текста в текущую строку после курсора;

i (insert) — вставка текста в текущую строку после курсора; o (open) — вставить пустую строку после текущей.

115

Замечание. Если в качестве управляющей используется клавиша нижнего регистра, операция редактирования реализуется после курсора, если верхнего — перед курсором.

Операции ввода текста необходимо завершить командой <Esc> — переводит редактор в режим редактирования послед-

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

Команды управления курсором в области текста файла. Два способа:

использование специальных клавиш-команд (например, $ или ^); использование общеизвестных управляющих клавиш клавиатуры.

Команды удаления текста:

х — удаление текущего символа; [#]dw — удаление # текущих слов; [#]dd —удаление текущих строк;

dG — удаление всех строк от текущей до последней; dS — удаление конца строки от текущей позиции; d^ — удаление начала строки до текущей позиции.

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

Команды отмены произведенных изменений в текущей строке: u — отмена (undo) последнего изменения;

U — отмена всех изменений.

Команды копирования указанного в команде объекта в буфер: [#]yw — копирование (yank) текущего слова;

[#]yy — копирование текущей строки;

уG — копирование строк от текущей до конца файла; yS — копирование части строки от курсора до конца

строки;

y^ — копирование части строки от курсора до начала

строки.

116

Команды вставки буфера в текст:

P — перед курсором; p — после курсора.

Команды изменения текста:

r<символ> — заменяет (change) текущий символ на указанный;

с<объект> — заменяет указанный объект на текст, который вводится с клавиатуры - <Esc>;

-#cw — изменение текущего слова; -#cc — всей текущей строки;

-cG — всех строк файла от текущей до последней; -cS — части строки от курсора до конца строки; -с^ — части строки от курсора до начала строки.

Команды поиска строки файла по фрагменту текста:

/<текст> — начиная от текущей строки до конца файла с переходом на его начало;

?<текст> — начиная от текущей строки до начала файла и по всему файлу;

n — поиск следующей строки в файле, аналогичной найденной; N—- поиск предыдущего вхождения в файл заданной строки.

Редактор имеет возможности поиска строк по шаблонам (например по диапазону символов) и пр.

На экране содержимое редактируемого файла представляется как бы через некоторое окно со следующими полями (сверху-вниз):

-область текста файла;

-область пустых строк, которые надо ввести, если они понадобятся;

-тильда (~) — область для ввода дополнительного текста файла, но пустых строк этой области в файле нет;

-область сообщений редактора или область префиксных exкоманд — операций редактора над группой строк файла или над целым файлом (команды вводятся на приглашение ":", отображаются на экране и исполняются по команде управляющей клавиши перевода строки).

117

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

:w файл — запись текущего буфера в файл; :m,nw файл — запись строк с m-й по n-ю в файл;

:e! — отмена всех изменений в буфере с перезагрузкой в него файла с диска;

:e файл — загрузка файла в буфер редактирования, файл замещает старое содержимое самого буфера;

:r файл — добавление содержимого файла после текущего положения курсора;

:set опция — значениеопций определяет настройку редактора ипр.

9.2. УПРАЖНЕНИЯ ДЛЯ ПРАКТИЧЕСКОГО ОСВОЕНИЯ РЕДАКТОРА

Упражнения и методика их выполнения направлены на практическое освоение основных возможностей встроенного текстового редактора vi.

Работа может выполняться в среде любой ОС UNIX. Изучаются команды:

вход в редактор и выход, сохранение файлов; ввода текста; удаления фрагментов текста;

копирования фрагментов текста в буферную область памяти; вставки содержимого буфера в текст файла; редактирования (изменения) текста; поиска строк файлов по их фрагментам;

многострочных операций с файлом (префиксные команды).

МЕТОДИКА ВЫПОЛНЕНИЯ

1.Войдите в редактор с созданием нового пустого файла с произвольным именем и расширением - .1.

2.Поместите в созданный файл текст, включающий не менее четырех строк с несколькими словами в каждой.

3.Вставьте по одной пустой строке до и после одной из строк файла.

4.Заполните пустые строки произвольным текстом.

118

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

6.Перейдите в режим редактирования и выполните произвольное редактирование отдельных слов и строк файла с использованием всех команд из групп "Команды изменения текста" и "Команды отмены произведенных изменений в текущей строке".

7.Выйдите из редактора с сохранением файла. Убедитесь в сохранении созданного файла.

8.Войдите опять в vi для редактирования созданного файла с использованием команд из групп "Команды копирования в буфер"

и"Команды вставки буфера в текст".

9.Поменяйте местами несколько слов в строках файла.

10.Поменяйте местами несколько строк.

11.Поменяйте местами последовательно начало строки с её концом и наоборот.

12.Выполните операции поиска строк файла по заданным их фрагментам с различными направлениями поиска (см. "Команды поиска строки файла по фрагменту её текста").

13.Не выходя из vi, перепишите полученную в результате редактирования версию файла в файл с тем же именем, но с расширением .new.

14.Добавьтепервые тристрокиредактируемого файла кфайлу .1.

16.Не выходя из vi, загрузите в буфер файл с расширением .1.

17.Последовательно удалите части строк и несколько строк с использованием команд из группы "Команды удаления текста".

18.Выйдите из редактора без сохранения файла.

19.Просмотрите и проанализируйте содержимое редактируемых файлов в текущем каталоге.

20.Уничтожьте созданные файлы.

Вопросы для самоконтроля

1.В чем осорбенности и преимущества встроенного редактора

viОС UNIX?

2.Какие два основных режима работы использует редактор? Как осуществляется переключение режимов?

3.Какую структуру имеет экран при редактировании файла? Назначение полей экрана.

119

4.Как в vi организовано редактирование открытого в нем фай-

ла?

5.Как организована работа с клавишными командами редакто-

ра?

6.Что такое “префиксные команды” и их назначение? Как организована работа с командами этого вида?

7.Какие функции редактора Вы использовали при выполнении лабораторной работы?

10. ПРИМЕРЫ SHELL-ПРОГРАММИРОВАНИЯ

Язык shell операционной системы UNIX предоставляет программисту очень широкие возможности и почти всегда позволяет решить любую задачу несколькими способами, используя различные сочетания команд. Однако для начального ознакомления с возможностями языка рекомендуется применять простейшие команды, рассмотренные ранее в настоящем пособии.

Для каждой из процедур предлагается вариант выполнения с передачей ей через параметры конкретных данных.

Все решения проверены в реальной операционной системе OS Linux в среде shell GNU bash (версия 3.2.39).

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

10.1.ПЕРЕДАЧА ПАРАМЕТРОВ В ПРОЦЕДУРУ

1.Написать процедуру, выводящую на экран текущую дату и время, полное маршрутное имя текущего каталога, полное маршрутное имя домашнего каталога пользователя, регистрационное имя пользователя, собственное имя процедуры.

Решение:

#proc1.1

#Вывод на экран текущей даты и времени

120