Advanced Bash-Scripting Guide

Advanced Bash-Scripting Guide

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

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

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


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


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

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

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


Посвящения

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

Содержание
Часть 1. Введение
1. Зачем необходимо знание языка Shell?
2. Для начала о Sha-Bang
2.1. Запуск сценария
2.2. Упражнения
Часть 2. Основы
3. Служебные символы
4. Переменные и параметры. Введение.
4.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. Перенаправление ввода/вывода
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. От автора
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. Авторские права
Перечень примеров
2-1. cleanup: Сценарий очистки лог-файлов в /var/log
2-2. cleanup: Расширенная версия предыдущего сценария.
3-1. Вложенные блоки и перенаправление ввода-вывода
3-2. Сохранение результата исполнения вложенного блока в файл
3-3. Запуск цикла в фоновом режиме
3-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 с помощью операции подстановки команд
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, копирование файлов из текущего каталога в другое место.
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.
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
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. Эмуляция массива с двумя измерениями
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
A-22. Объектно ориентированная база данных
A-23. Монтирование USB-устройств флэш-памяти.
A-24. Резервное копирование файлов журналов
A-25. Предотвращение интерпретации строк символов
A-26. Принудительная интерпретация строк
A-27. Повторение основ
C-1. Подсчет количества символов
I-1. Пример файла .bashrc
J-1. VIEWDATA.BAT: пакетный файл DOS
J-2. viewdata.sh: Результат преобразования VIEWDATA.BAT в сценарий командной оболочки