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. Введение
- Часть 2. Основы
- Часть 3. Углубленный материал
-
- 9. К вопросу о переменных
- 10. Циклы и ветвления
-
- 10.1. Циклы
- 10.2. Вложенные циклы
- 10.3. Управление ходом выполнения цикла
- 10.4. Операторы выбора
- 11. Внутренние команды
- 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. Регулярные выражения
- 19. Подоболочки, или Subshells
- 20. Ограниченный режим командной оболочки
- 21. Подстановка процессов
- 22. Функции
- 23. Псевдонимы
- 24. Списки команд
- 25. Массивы
- 26. Файлы
- 27. /dev и /proc
- 28. /dev/zero и /dev/null
- 29. Отладка сценариев
- 30. Необязательные параметры (ключи)
- 31. Широко распространенные ошибки
- 32. Стиль программирования
- 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
- 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-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 в сценарий командной оболочки
Вперед | ||
Введение |