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

��������: Russian Linux Gazette ����� ����������� � html-������� (~380��) ����� ����������� � sgml-������� (~380��)

Advanced Bash-Scripting Guide

��������� ���������������� �� ����� ���������
��������� ��������

�������: ������ �������

��������: Russian Linux Gazette

����� ����������� � html-������� (~380��)

����� ����������� � sgml-������� (~380��)


������ ����������� �� ������������ ������� � ��������
�������� � ������� ���������������� �� ����� ���������,
������, ������ ���������� ���� ���������� . . . ����������, ��� �� ����� ���������
�������� � ������� UNIX
. ��� ����������� �����
��������������� ��� �������, ��������������� ���
���������������� �������� ��� ��� ���������� ��
���������������� �� shell. ����������� �������� ������
������ ������������������� ��������, ��������� ������ ���� � �������� �����
��������� — ��� ��������� ���������
.

��������� ������ ���������, � ���� .bz2 ������, ����������
�������� ������ � ������� SGML � HTML, �� ������� �� �������� ��������� ������. ��� �� ��
������� � change log.


Advanced Bash-Scripting Guide: Искусство программирования на языке сценариев командной оболочки

Версия 2.5 (15 февраля 2004)

Перевод: Андрей Киселев (kis_an at mail dot ru)

Данное руководство не предполагает наличие у читателя познаний в области программирования на языке сценариев, однако, быстро восполняет этот недостаток постепенно, шаг за шагом раскрывая мудрость и красоту Unix. Это руководство может рассматриваться как учебник, предназначенный для самостоятельного изучения или как справочник по программированию на shell. Руководство снабжено серией хорошо прокомментированных примеров, поскольку лучший путь к изучению языка сценариев — это написание сценариев.

Кроме того, эта книга может служить в качестве учебного пособия по основам програмирования вообще.

Последнюю версию документа, в виде .tar.gz архива, содержащем исходные тексты в формате SGML и HTML, вы найдете на домашней страничке автора.



Посвящения

Посвящается Аните — источнику очарования

Искусство программирования на языке сценариев командной оболочки

Данное руководство не предполагает наличие у читателя познаний в области программирования на языке сценариев, однако, быстро восполняет этот недостаток, постепенно, шаг за шагом раскрывая мудрость и красоту UNIX. Это руководство может рассматриваться как учебник, предназначенный для самостоятельного изучения или как справочник по программированию на shell. Руководство снабжено серией хорошо прокомментированных примеров, поскольку лучший путь к изучению языка сценариев — это написание сценариев.

Advanced Bash-Scripting Guide

Автор: Мендель Купер (Mendel Cooper thegrendel@theriver.com)

Перевод: Андрей Киселев <kis_an@mail.ru>

Посвящения

Посвящается Аните — источнику очарования

Часть 1. Введение

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

Глава 1. Зачем необходимо знание языка Shell?

Знание языка командной оболочки является залогом успешного решения задач администрирования системы. Даже если вы не предполагаете заниматься написанием своих сценариев. Во время загрузки Linux выполняется целый ряд сценариев из /etc/rc.d, которые настраивают конфигурацию операционной системы и запускают различные сервисы, поэтому очень важно четко понимать эти скрипты и иметь достаточно знаний, чтобы вносить в них какие либо изменения.

Язык сценариев легок в изучении, в нем не так много специфических операторов и конструкций. [ 1 ]Синтаксис языка достаточно прост и прямолинеен, он очень напоминает команды, которые приходится вводить в командной строке. Короткие скрипты практически не нуждаются в отладке, и даже отладка больших скриптов отнимает весьма незначительное время.

Shell-скрипты очень хорошо подходят для быстрого создания прототипов сложных приложений, даже не смотря на ограниченный набор языковых конструкций и определенную «медлительность». Такая метода позволяет детально проработать структуру будущего приложения, обнаружить возможные «ловушки» и лишь затем приступить к кодированию на C, C++, Java, или Perl.

Скрипты возвращают нас к классической философии UNIX — «разделяй и влавствуй» т.е. разделение сложного проекта на ряд простых подзадач. Многие считают такой подход наилучшим или, по меньшей мере, наиболее эстетичным способом решения возникающих проблем, нежели использование нового поколения языков — «все-в-одном», таких как Perl.

Для каких задач неприменимы скрипты

для ресурсоемких задач, особенно когда важна скорость исполнения (поиск, сортировка и т.п.)

для задач, связанных с выполнением математических вычислений, особенно это касается вычислений с плавающей запятой, вычислений с повышенной точностью, комплексных чисел (для таких задач лучше использовать C++ или FORTRAN)

для кросс-платформенного программирования (для этого лучше подходит язык C)

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

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

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

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

для задач, выполняющих огромный объем работ с файлами

для задач, работающих с многомерными массивами

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

когда необходимо предоставить графический интерфейс с пользователем (GUI)

когда необходим прямой доступ к аппаратуре компьютера

когда необходимо выполнять обмен через порты ввода-вывода или сокеты

когда необходимо использовать внешние библиотеки

вернуться

1

Их так же называют встроенными конструкциями языка командной оболочки shell.

Advanced Bash-Scripting Guide

Искусство программирования на языке сценариев командной оболочки

Версия 2.5 (15 февраля 2004)

Автор: Mendel Cooper (thegrendel at theriver dot com)

Перевод: Андрей Киселев (kis_an at mail dot ru)

Данное руководство не предполагает наличие у читателя познаний в области программирования на языке сценариев, однако, быстро восполняет этот недостаток . . . постепенно, шаг за шагом раскрывая мудрость и красоту Unix™. Это руководство может рассматриваться как учебник, предназначенный для самостоятельного изучения или как справочник по программированию на shell. Руководство снабжено серией хорошо прокомментированных примеров, поскольку лучший путь к

изучению языка сценариев — это написание сценариев.

Кроме того, эта книга может служить в качестве учебного пособия по основам програмирования вообще.

Последнюю версию документа, в виде .bz2 архива, содержащем исходные тексты в формате SGML и HTML, вы найдете на домашней страничке автора. Там же вы найдете и список изменений (change log).

Посвящения

Посвящается Аните — источнику очарования

Содержание

Часть 1. Введение

1.Зачем необходимо знание языка Shell?

2.Для начала о Sha-Bang

2.1.Запуск сценария

2.2.Упражнения

Часть 2. Основы

3.Служебные символы

4.Переменные и параметры. Введение.

4.1.Подстановка переменных

1

4.2.Присваивание значений переменным

4.3.Переменные Bash не имеют типа

4.4.Специальные типы переменных

5.Кавычки

6.Завершение и код завершения

7.Проверка условий

7.1.Конструкции проверки условий

7.2.Операции проверки файлов

7.3.Операции сравнения

7.4.Вложенные условные операторы if/then

7.5.Проверка степени усвоения материала

8.Операции и смежные темы

8.1.Операторы

8.2.Числовые константы Часть 3. Углубленный материал

9.К вопросу о переменных

9.1.Внутренние переменные

9.2.Работа со строками

9.3.Подстановка параметров

9.4.Объявление переменных: declare и typeset

9.5.Косвенные ссылки на переменные

9.6.$RANDOM: генерация псевдослучайных целых чисел

9.7.Двойные круглые скобки

10.Циклы и ветвления

10.1.Циклы

10.2.Вложенные циклы

10.3.Управление ходом выполнения цикла

10.4.Операторы выбора

11.Внутренние команды

11.1.Команды управления заданиями

12.Внешние команды, программы и утилиты

12.1.Базовые команды

12.2.Более сложные команды

12.3.Команды для работы с датой и временем

12.4.Команды обработки текста

12.5.Команды для работы с файлами и архивами

12.6.Команды для работы с сетью

12.7.Команды управления терминалом

12.8.Команды выполнения математических операций

12.9.Прочие команды

13.Команды системного администрирования

14.Подстановка команд

15.Арифметические подстановки

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

2

16.1.С помощью команды exec

16.2.Перенаправление для блоков кода

16.3.Область применения

17.Встроенные документы

Часть 4. Материал повышенной сложности

18.Регулярные выражения

18.1.Краткое введение в регулярные выражения

18.2.Globbing — Подстановка имен файлов

19.Подоболочки, или Subshells

20.Ограниченный режим командной оболочки

21.Подстановка процессов

22.Функции

22.1.Сложные функции и сложности с функциями

22.2.Локальные переменные

22.3.Рекурсия без локальных переменных

23.Псевдонимы

24.Списки команд

25.Массивы

26.Файлы

27./dev и /proc

27.1./dev

27.2./proc

28./dev/zero и /dev/null

29.Отладка сценариев

30.Необязательные параметры (ключи)

31.Широко распространенные ошибки

32.Стиль программирования

32.1.Неофициальные рекомендации по оформлению сценариев

33.Разное

33.1.Интерактивный и неинтерактивный режим работы

33.2.Сценарии-обертки

33.3.Операции сравнения: Альтернативные решения

33.4.Рекурсия

33.5.«Цветные» сценарии

33.6.Оптимизация

33.7.Разные советы

33.8.Проблемы безопасности

33.9.Проблемы переносимости

33.10.Сценарии командной оболочки под Windows

34.Bash, версия 2

35.Замечания и дополнения

35.1.От автора

3

35.2.Об авторе

35.3.Куда обращаться за помощью

35.4.Инструменты, использовавшиеся при создании книги

35.4.1.Аппаратура

35.4.2.Программное обеспечение

35.5.Благодарности

Библиография

A.Дополнительные примеры сценариев

B.Справочная информация

C.Маленький учебник по Sed и Awk

C.1. Sed

C.2. Awk

D.Коды завершения, имеющие предопределенный смысл

E.Подробное введение в операции ввода-вывода и перенаправление ввода-вывода

F.Системные каталоги

G.Локализация

H.История команд

I.Пример файла .bashrc

J.Преобразование пакетных (*.bat) файлов DOS в сценарии командной оболочки

K.Упражнения

K.1. Анализ сценариев

K.2. Создание сценариев

L.Хронология

M.Авторские права

Перечень таблиц

11-1. Идентификация заданий

30-1. Ключи Bash

33-1. Числовые значения цвета в escape-последовательностях B-1. Переменные специального назначения

B-2. Операции проверки: Двухместные операции B-3. Операции проверки: Файлы

B-4. Подстановка параметров и экспансия B-5. Операции со строками

B-6. Прочие конструкции C-1. Основные операции sed C-2. Примеры операций в sed

D-1. «Зарезервированные» коды завершения

J-1. Ключевые слова/переменные/операторы пакетных файлов DOS и их аналоги командной оболочки

J-2. Команды DOS и их эквиваленты в Unix L-1. Хронология

Перечень примеров

2-1. cleanup: Сценарий очистки лог-файлов в /var/log 2-2. cleanup: Расширенная версия предыдущего сценария. 3-1. Вложенные блоки и перенаправление ввода-вывода

3-2. Сохранение результата исполнения вложенного блока в файл 3-3. Запуск цикла в фоновом режиме

3-4. Резервное архивирование всех файлов, которые были изменены в течение последних суток

4

4-1. Присваивание значений переменным и подстановка значений переменных

4-2. Простое присваивание

4-3. Присваивание значений переменным простое и замаскированное

4-4. Целое число или строка?

4-5. Позиционные параметры

4-6. wh, whois выяснение имени домена

4-7. Использование команды shift

5-1. Вывод «причудливых» переменных

5-2. Экранированные символы

6-1. завершение / код завершения 6-2. Использование символа ! для логической инверсии кода возврата 7-1. Что есть «истина»?

7-2. Эквиваленты команды test /usr/bin/test, [ ], и /usr/bin/[

7-3. Арифметические выражения внутри (( ))

7-4. Проверка «битых» ссылок

7-5. Операции сравнения

7-6. Проверка является ли строка пустой

7-7. zmost

8-1. Наибольший общий делитель

8-2. Арифметические операции 8-3. Построение сложных условий, использующих && и ||

8-4. Различные представления числовых констант

9-1. $IFS и пробельные символы

9-2. Ограничения времени ожидания ввода 9-3. Еще один пример ограничения времени ожидания ввода от пользователя

9-4. Ограничение времени ожидания команды read

9-5. Я root?

9-6. arglist: Вывод списка аргументов с помощью переменных $* и $@ 9-7. Противоречия в переменных $* и $@

9-8. Содержимое $* и $@, когда переменная $IFS пуста 9-9. Переменная «подчеркивание»

9-10. Вставка пустых строк между параграфами в текстовом файле 9-11. Преобразование графических файлов из одного формата в другой, с изменением имени файла 9-12. Альтернативный способ извлечения подстрок 9-13. Подстановка параметров и сообщения об ошибках

9-14. Подстановка параметров и сообщение о «порядке использования» 9-15. Длина переменной 9-16. Поиск по шаблону в подстановке параметров

9-17. Изменение расширений в именах файлов:

9-18. Поиск по шаблону при анализе произвольных строк 9-19. Поиск префиксов и суффиксов с заменой по шаблону 9-20. Объявление переменных с помощью инструкции declare 9-21. Косвенные ссылки

9-22. Передача косвенных ссылок в awk

9-23. Генерация случайных чисел

9-24. Выбор случайной карты из колоды

9-25. Псевдослучайное число из заданного диапазона

9-26. Имитация бросания кубика с помощью RANDOM

9-27. Переустановка RANDOM

9-28. Получение псевдослучайных чисел с помощью awk 9-29. Работа с переменными в стиле языка C

10-1. Простой цикл for

10-2. Цикл for с двумя параметрами в каждом из элементов списка 10-3. Fileinfo: обработка списка файлов, находящегося в переменной 10-4. Обработка списка файлов в цикле for

10-5. Цикл for без списка аргументов

10-6. Создание списка аргументов в цикле for с помощью операции подстановки команд

5

10-7. grep для бинарных файлов

10-8. Список всех пользователей системы 10-9. Проверка авторства всех бинарных файлов в текущем каталоге 10-10. Список символических ссылок в каталоге

10-11. Список символических ссылок в каталоге, сохраняемый в файле 10-12. C-подобный синтаксис оператора цикла for

10-13. Работа с командой efax в пакетном режиме 10-14. Простой цикл while

10-15. Другой пример цикла while

10-16. Цикл while с несколькими условиями

10-17. C-подобный синтаксис оформления цикла while

10-18. Цикл until

10-19. Вложенный цикл

10-20. Команды break и continue в цикле

10-21. Прерывание многоуровневых циклов

10-22. Передача управление в начало внешнего цикла

10-23. Живой пример использования «continue N»

10-24. Использование case

10-25. Создание меню с помощью case

10-26. Оператор case допускает использовать подстановку команд вместо анализируемой переменной 10-27. Простой пример сравнения строк

10-28. Проверка ввода

10-29. Создание меню с помощью select

10-30. Создание меню с помощью select в функции 11-1. printf в действии

11-2. Ввод значений переменных с помощью read

11-3. Пример использования команды read без указания переменной для ввода 11-4. Ввод многострочного текста с помощью read

11-5. Обнаружение нажатия на курсорные клавиши

11-6. Чтение командой read из файла через перенаправление 11-7. Проблемы чтения данных из канала (конвейера)

11-8. Смена текущего каталога

11-9. Команда let, арифметические операции.

11-10. Демонстрация команды eval

11-11. Принудительное завершение сеанса

11-12. Шифрование по алгоритму «rot13»

11-13. Замена имени переменной на ее значение, в исходном тексте программы на языке Perl, с помощью eval

11-14. Установка значений аргументов с помощью команды set 11-15. Изменение значений позиционных параметров (аргументов) 11-16. «Сброс» переменной

11-17. Передача переменных во вложенный сценарий awk, с помощью export 11-18. Прием опций/аргументов, передаваемых сценарию, с помощью getopts 11-19. «Подключение» внешнего файла 11-20. Пример (бесполезный) сценария, который подключает себя самого. 11-21. Команда exec

11-22. Сценарий, который запускает себя самого 11-23. Ожидание завершения процесса перед тем как продолжить работу

11-24. Сценарий, завершающий себя сам с помощью команды kill

12-1. Создание оглавления диска для записи CDR, с помощью команды ls 12-2. Здравствуй или Прощай

12-3. Badname, удаление файлов в текущем каталоге, имена которых содержат недопустимые символы и пробелы.

12-4. Удаление файла по его номеру inode

12-5. Использование команды xargs для мониторинга системного журнала 12-6. copydir, копирование файлов из текущего каталога в другое место.

6

12-7. Завершение работы процесса по его имени

12-8. Подсчет частоты встречаемости слов using xargs

12-9. Пример работы с expr

12-10. Команда date

12-11. Частота встречаемости отдельных слов

12-12. Какие из файлов являются сценариями?

12-13. Генератор 10-значных случайных чисел

12-14. Мониторинг системного журнала с помощью tail

12-15. Сценарий-эмулятор «grep»

12-16. Поиск слов в словаре

12-17. toupper: Преобразование символов в верхний регистр.

12-18. lowercase: Изменение имен всех файлов в текущем каталоге в нижний регистр. 12-19. du: Преобразование текстового файла из формата DOS в формат Unix.

12-20. rot13: Сверхслабое шифрование по алгоритму rot13. 12-21. Более «сложный» шифр 12-22. Отформатированный список файлов.

12-23. Пример форматирования списка файлов в каталоге

12-24. nl: Самонумерующийся сценарий.

12-25. Пример перемещения дерева каталогов с помощью cpio 12-26. Распаковка архива rpm

12-27. Удаление комментариев из файла с текстом программы на языке C 12-28. Исследование каталога /usr/X11R6/bin

12-29. «Расширенная» команда strings

12-30. Пример сравнения двух файлов с помощью cmp. 12-31. Утилиты basename и dirname

12-32. Проверка целостности файла

12-33. Декодирование файлов 12-34. Сценарий, отправляющий себя самого по электронной почте

12-35. Ежемесячные выплаты по займу 12-36. Перевод чисел из одной системы счисления в другую

12-37. Пример взаимодействия bc со «встроенным документом» 12-38. Вычисление числа «пи»

12-39. Преобразование чисел из десятичной в шестнадцатиричную систему счисления 12-40. Разложение числа на простые множители 12-41. Расчет гипотенузы прямоугольного треугольника

12-42. Использование seq для генерации списка аргументов цикла for 12-43. Использование getopt для разбора аргументов командной строки 12-44. Захват нажатых клавиш 12-45. Надежное удаление файла 12-46. Генератор имен файлов 12-47. Преобразование метров в мили

12-48. Пример работы с m4

13-1. Установка нового пароля

13-2. Установка символа «забоя»

13-3. невидимый пароль: Отключение эхо-вывода на терминал 13-4. Перехват нажатия на клавиши с помощью stty.

13-5. Использование команды pidof при остановке процесса

13-6. Проверка образа CD

13-7. Создание файловой системы в обычном файле

13-8. Добавление нового жесткого диска

13-9. Сценарий killall, из каталога /etc/rc.d/init.d 14-1. Глупая выходка 14-2. Запись результатов выполнения цикла в переменную

16-1. Перенаправление stdin с помощью exec

16-2. Перенаправление stdout с помощью exec

16-3. Одновременное перенаправление устройств, stdin и stdout, с помощью команды exec 16-4. Перенаправление в цикл while

7

16-5. Альтернативная форма перенаправления в цикле while

16-6. Перенаправление в цикл until

16-7. Перенаправление в цикл for

16-8. Перенаправление устройств (stdin и stdout) в цикле for 16-9. Перенаправление в конструкции if/then

16-10. Файл с именами «names.data», для примеров выше 16-11. Регистрация событий

17-1. dummyfile: Создание 2-х строчного файла-заготовки

17-2. broadcast: Передача сообщения всем, работающим в системе, пользователям 17-3. Вывод многострочных сообщений с помощью cat

17-4. Вывод многострочных сообщений с подавлением символов табуляции 17-5. Встроенные документы и подстановка параметров

17-6. Передача пары файлов во входящий каталог на «Sunsite» 17-7. Отключение подстановки параметров 17-8. Сценарий, который создает другой сценарий 17-9. Встроенные документы и функции 17-10. «Анонимный» Встроенный Документ 17-11. Блочный комментарий 17-12. Встроенная справка к сценарию

19-1. Область видимости переменных

19-2. Личные настройки пользователей

19-3. Запуск нескольких процессов в подоболочках

20-1. Запуск сценария в ограниченном режиме

22-1. Простые функции

22-2. Функция с аргументами

22-3. Передача косвенных ссылок в функцию 22-4. Изменение значения переменной, переданной в функцию по ссылке.

22-5. Еще один пример разыменования параметров функции, передаваемых по ссылке. 22-6. Наибольшее из двух чисел 22-7. Преобразование чисел в римскую форму записи

22-8. Проверка возможности возврата функциями больших значений

22-9. Сравнение двух больших целых чисел

22-10. Настоящее имя пользователя

22-11. Область видимости локальных переменных

22-12. Использование локальных переменных при рекурсии

22-13. Ханойские Башни

23-1. Псевдонимы в сценарии

23-2. unalias: Объявление и удаление псевдонимов

24-1. Проверка аргументов командной строки с помощью «И-списка» 24-2. Еще один пример проверки аргументов с помощью «И-списков» 24-3. Комбинирование «ИЛИ-списков» и «И-списков»

25-1. Простой массив

25-2. Форматирование стихотворения

25-3. Различные операции над массивами

25-4. Строковые операции и массивы

25-5. Загрузка исходного текста сценария в массив

25-6. Некоторые специфичные особенности массивов

25-7. Пустые массивы и пустые элементы

25-8. Инициализация массивов

25-9. Копирование и конкатенация массивов

25-10. Еще пример на конкатенацию массивов

25-11. Старая, добрая: «Пузырьковая» сортировка

25-12. Вложенные массивы и косвенные ссылки

25-13. Пример реализации алгоритма Решето Эратосфена 25-14. Эмуляция структуры «СТЕК» («первый вошел последний вышел») 25-15. Исследование математических последовательностей

25-16. Эмуляция массива с двумя измерениями

8

27-1. Пример работы с псевдоустройством /dev/tcp

27-2. Поиск файла программы по идентификатору процесса

27-3. Проверка состояния соединения

28-1. Удаление cookie-файлов

28-2. Создание файла подкачки (swapfile), с помощью /dev/zero 28-3. Создание электронного диска 29-1. Сценарий, содержащий ошибку 29-2. Пропущено ключевое слово

29-3. test24

29-4. Проверка условия с помощью функции «assert»

29-5. Ловушка на выходе

29-6. Удаление временного файла при нажатии на Control-C 29-7. Трассировка переменной 31-1. Строки и числа нельзя сравнивать напрямую 31-2. Западня в подоболочке

31-3. Передача вывода от команды echo команде read, по конвейеру

33-1. сценарий-обертка

33-2. Более сложный пример сценария-обертки

33-3. Сценарий-обертка вокруг сценария awk

33-4. Сценарий на языке Perl, встроенный в Bash-скрипт 33-5. Комбинирование сценария Bash и Perl в одном файле 33-6. Сценарий (бесполезный), который вызывает себя сам

33-7. Сценарий (имеющий практическую ценность), который вызывает себя сам 33-8. Еще один сценарий, который вызывает себя сам 33-9. «Цветная» адресная книга 33-10. Вывод цветного текста

33-11. Необычный способ передачи возвращаемого значения

33-12. Необычный способ получения нескольких возвращаемых значений 33-13. Передача массива в функцию и возврат массива из функции 33-14. Игры с анаграммами

33-15. Сценарий с графическим интерфейсом

34-1. Расширение строк 34-2. Косвенные ссылки на переменные новый метод

34-3. Простая база данных, с применением косвенных ссылок 34-4. Массивы и другие хитрости для раздачи колоды карт в четыре руки A-1. manview: Просмотр страниц руководств man

A-2. mailformat: Форматирование электронных писем

A-3. rn: Очень простая утилита для переименования файлов

A-4. blank-rename: переименование файлов, чьи имена содержат пробелы A-5. encryptedpw: Передача файла на ftp-сервер, с использованием пароля A-6. copy-cd: Копирование компакт-дисков с данными

A-7. Последовательности Коллаца (Collatz)

A-8. days-between: Подсчет числа дней между двумя датами A-9. Создание «словаря»

A-10. Расчет индекса «созвучности» A-11. «Игра «Жизнь»»

A-12. Файл с первым поколением для игры «Жизнь»

A-13. behead: Удаление заголовков из электронных писем и новостей A-14. ftpget: Скачивание файлов по ftp

A-15. Указание на авторские права

A-16. password: Генератор случайного 8-ми символьного пароля A-17. fifo: Создание резервных копий с помощью именованных каналов

A-18. Генерация простых чисел, с использованием оператора деления по модулю (остаток от деления)

A-19. tree: Вывод дерева каталогов

A-20. Функции для работы со строками

A-21. Directory information

9

Соседние файлы в папке Справочный материал

  • #
  • #
  • #
  • #
  • #
  • #

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

Права на коммерческое распространение книги могут быть получены у автора.

Автор произвел этот документ в соответствии с буквой и духом LDP Manifesto.

Hyun Jin Cha завершил перевод на Корейский язык версию 1.0.11 этой книги. Переводы на Испанский, Португальский, Французский, Немецкий, Итальянский и Китайский языки находятся на стадии реализации. Если вы изъявите желание перевести этот документ на другой язык, то можете свободно выполнить этот перевод, основываясь на условиях, заявленных выше. В этом случае, автор хотел бы, чтобы его поставили в известность.

Linux — это торговая марка, принадлежащая Линусу Торвальдсу (Linus Torvalds). Unix и UNIX — это торговая марка, принадлежащая Open Group. MS Windows — это торговая марка, принадлежащая Microsoft Corp. Все другие коммерческие торговые марки, упомянутые в данном документе, принадлежат их владельцам.

Примечания

1

Их так же называют встроенными конструкциями языка командной оболочки shell.

2

Многие особенности ksh88 и даже ksh93 перекочевали в Bash.

3

В соответствии с соглашениями, имена файлов с shell-скриптами, такими как Bourne shell и совместимыми, имеют расширение .sh. Все стартовые скрипты, которые вы найдете в /etc/rc.d, следуют этому соглашению.

4

Некоторые разновидности UNIX (основанные на 4.2BSD) требуют, чтобы эта последовательность состояла из 4-х байт, за счет добавления пробела после !, #! /bin/sh.

5

В shell-скриптах последовательность #! должна стоять самой первой и задает интерпретатор (sh или bash). Интерпретатор, в свою очередь, воспринимает эту строку как комментарий, поскольку она начинается с символа #.

Если в сценарии имеются еще такие же строки, то они воспринимаются как обычный комментарий.

#!/bin/bash

echo «Первая часть сценария.»

a=1

#!/bin/bash

# Это *НЕ* означает запуск нового сценария.

echo «Вторая часть сценария.»

echo $a # Значение переменной $a осталось равно 1.

6

Эта особенность позволяет использовать различные хитрости.

#!/bin/rm

# Самоуничтожающийся сценарий.

# Этот скрипт ничего не делает — только уничтожает себя.

WHATEVER=65

echo «Эта строка никогда не будет напечатана.»

exit $WHATEVER # Не имеет смысла, поскольку работа сценария завершается не здесь.

Попробуйте запустить файл README с сигнатурой #!/bin/more (предварительно не забудьте сделать его исполняемым).

7

Portable Operating System Interface, попытка стандартизации UNIX-подобных операционных систем.

8

Внимание: вызов Bash-скрипта с помощью команды sh scriptname отключает специфичные для Bash расширения, что может привести к появлению ошибки и аварийному завершению работы сценария.

9

Сценарий должен иметь как право на исполнение, так и право на чтение, поскольку shell должен иметь возможность прочитать скрипт.

10

Почему бы не запустить сценарий просто набрав название файла scriptname, если сценарий находится в текущем каталоге? Дело в том, что из соображений безопасности, путь к текущему каталогу «.» не включен в переменную окружения $PATH. Поэтому необходимо явно указывать путь к текущему каталогу, в котором находится сценарий, т.е. ./scriptname.

11

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

12

Исключение: блок кода, являющийся частью конвейера, может быть запущен в дочернем процессе (subshell-е).

ls | { read firstline; read secondline; }

# Ошибка! Вложенный блок будет запущен в дочернем процессе,

# таким образом, вывод команды «ls» не может быть записан в переменные

# находящиеся внутри блока.

echo «Первая строка: $firstline; вторая строка: $secondline» # Не работает!

# Спасибо S.C.

13

Аргумент $0 устанавливается вызывающим процессом. В соответствии с соглашениями, этот параметр содержит имя файла скрипта. См. страницы руководства для execv (man execv).

14

Символ «!», помещенный в двойные кавычки, порождает сообщение об ошибке, если команда вводится с командной строки. Вероятно это связано с тем, что этот символ интерпретируется как попытка обращения к истории команд. Однако внутри сценариев такой прием проблем не вызывает.

Не менее любопытно поведение символа «», употребляемого внутри двойных кавычек.

bash$ echo hello!

hello!

bash$ echo «hello!»

hello!

bash$ echo -e xty

xty

bash$ echo -e «xty»

x y

(Спасибо Wayne Pollock за пояснения.)

15

«Разбиение на слова», в данном случае это означает разделение строки символов на некоторое число аргументов.

16

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

17

В современных UNIX-системах, «sticky bit» больше не используется для файлов, только для каталогов.

18

Как указывает S.C., даже заключение строки в кавычки, при построении сложных условий проверки, может оказаться недостаточным. [ -n «$string» -o «$a» = «$b» ] в некоторых версиях Bash такая проверка может вызвать сообщение об ошибке, если строка $string пустая. Безопаснее, в смысле отказоустойчивости, было бы добавить какой-либо символ к, возможно пустой, строке: [ «x$string» != x -o «x$a» = «x$b» ] (символ «x» не учитывается).

19

PID текущего процесса хранится в переменной $$.

20

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

21

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

Читать дальше

Понравилась статья? Поделить с друзьями:
  • Купала старославянский праздник
  • Купала славянский праздник дата
  • Купала праздник славян когда
  • Купала божество плодов праздник летнего солнцеворота
  • Купава праздник древнеславянский