Практическое написание сценариев командной оболочки Bash
командной оболочки Bash
Приемы программирования сценариев в Bash
В этом учебнике мы рассмотрим язык сценариев командной оболочки Bash. Отличительной особенностью этого учебника является то, что мы не будем сухо пересказывать документацию к командной оболочке, а попытаемся рассказать о языке с практической стороны.
В этом учебнике предполагается, что вы уже знакомы с основами синтаксиса языка Bash. Если это не так, то мы рекомендуем прочитать учебник Cooper, Mendel Искусство программирования на языке сценариев командной оболочки = Advanced Bash-Scripting Guide., который подробно рассказывает об основах синтаксиса языка.
Введение
правитьBash — это одна из наиболее популярных командных оболочек; клон командной оболочки Bourne Shell. Во многих дистрибутивах Linux эта оболочка предустановлена по умолчанию и используется для интерактивного взаимодействия пользователя с системой, а также для автоматизации рутинных задач как самой системы, так и ее пользователей.
Рутинные повторяющиеся задачи пользователь оформляет в форме файлов-сценариев, которые могут быть переданы командной оболочке на исполнение. Сценарий (скрипт) — это программа, интерпретируемая Bash. Область применения Bash напрямую связана с системными задачами, но в принципе вы можете писать на нем не очень сложные приложения, связанные с формированием, например, отчетов; анализа данных; прототипов программ для демонстраций и др.
Язык сценариев Bash имеет следующие преимущества перед другими скриптовыми языками:
- Самое очевидное — вам не нужен компилятор. Вы можете написать программу, запустить ее и увидеть результат сразу. Изменяя содержимое файла сценария, изменения применяются сразу же.
- Как правило, Bash идет в поставке с дистрибутивом, т.е. вы можете начать пользоваться им сразу после установки операционной системы.
- Язык сценариев Bash очень простой в освоении. Основные сложности языка связаны с некоторыми особенностями интерпретации, которые требуют некоторой концентрации внимания у программиста. Особая концентрация также нужна при написании любого кода Bash, так как любой лишний пробел, любой не введенный ключевой символ может приводить к неожиданным последствиям.
Самым большим сдерживающим фактором применения синтаксиса Bash для написания сценариев является плохая совместимость. В целом, сценарии, которые используют только оригинальный синтаксис Bourne Shell, совместимы между командными оболочками, которые ответвились от него.
Например, можно написать сценарий, который будет одинаково хорошо исполняться, вообще говоря, в разных командных оболочках Bash и Zsh. Но при этом приходится жертвовать использованием очень полезных расширений Bash, существенно упрощающих написание кода скрипта.
Даже в пределах одного мажорного номера, разные версии Bash могут выполнять некоторые конструкции по-разному, поэтому следует тщательно тестировать большие сценарии. Например, сравните как выполняется следующий код в разных версиях Bash:
#!/bin/bash
echo "BASH VERSION = $BASH_VERSION"
echo "--------------------------------"
while read -r key val; do
echo "$key = $val"
done <<< $(
for key in alpha beta gamma; do
for value in {1..3}; do
printf "$key $value\n"
done
done
)
BASH VERSION = 4.4.19(1)-release
--------------------------------
alpha = 1
alpha = 2
alpha = 3
beta = 1
beta = 2
beta = 3
gamma = 1
gamma = 2
gamma = 3
#################################################################
BASH VERSION = 4.2.46(2)-release
--------------------------------
alpha = 1 alpha 2 alpha 3 beta 1 beta 2 beta 3 gamma 1 gamma 2 gamma 3
Еще Bash имеет плохую производительность и не может полноценно выполнять арифметические операции, но учитывая специфику задач, которые он решает, это не так уж и важно. Если вам нужны более производительные сценарии, которые требуют также обработки сложных структур данных, следует отдавать предпочтение более продвинутым скриптовым языкам, например Perl.
Версия Bash
правитьМатериал этой книги написан в основном относительно Bash 4. Использовать командную оболочку меньшей версии крайне не рекомендуется из-за проблем в безопасности старых версий.
На момент написания книги автор использовал версию 4.4.19(1)-release.
Как читать эту книгу
правитьКнигу можно начать читать с любой главы, так как каждая из них рассматривает тему обособленно. Тем не менее, главы выстроены в логическом порядке (от частных вещей к более общим).
- Глава 1. Команда test
- Команда
test
является одной из ключевых в языке командной оболочки, так как с помощью нее строятся все условия. Данная глава посвящена приемам использования командыtest
.
- Команда
- Глава 2. Ветвления
- В данной главе рассмотрены способы построения условных конструкций в языке командной оболочки.
- Глава 3. Циклы
- В данной главе рассмотрены циклы и способы их использования в языке командной оболочки.
- Глава 4. Функции
- В данной главе рассмотрены способы объявления функций и некоторые приемы построения приложений, написанных на языке командной оболочки Bash.
- Глава 5. Эмуляция ссылочной адресации
- В язык командной оболочки не была заложена передача данных по ссылкам. Тем не менее, существуют способы такую передачу эмулировать. В данной главе показаны приемы передачи данных, позволяющие воспроизвести передачу данных по ссылке.
- Глава 6. Bash подстановки
- Интерпретатор языка командной оболочки, вообще говоря, заменяет идентификаторы переменных в сценарии (подставляет) строковыми значениями, хранящимися в контексте командной оболочки. Некоторые подстановки позволяют модифицировать подставляемую строку некоторым образом. В этой главе рассмотрены базовые подстановки Bash.
- Глава 7. Команды
- В данной главе рассмотрена общая концепция команды, которой оперирует командная оболочка. Показаны как могут быть вызваны командные списки (в подоболочке, в конвейере или блоком) и какой контекст им может быть передан во время вызова.
- Глава 8. Команда read
- Команда
read
позволяет читать командной оболочке её стандартный поток ввода или файлы системы. В данной главе рассмотрены приемы работы с командойread
.
- Команда
- Глава 9. Код-сниппеты
- Все сценарии похожи в чем-то друг на друга: в любом из них можно выделить часть, которая принимает данные, анализирует их, принимает некоторые решения и на их основе продуцирует некоторые действия и/или файлы. Некоторые общие процедуры (вывод сообщений сценария, ожидание пользовательского ввода и др.) мы оформили короткими кусками кода, не привязанными к конкретной области знаний — код-сниппетами.
Ошибки в тексте
правитьАвтор этой книги конечно много знает об интерпретаторе Bash, но в чем-то может заблуждаться и неспециально передать свои заблуждения в текст данной книги. Во время подготовки текста, автор попробовал весь код, который написал, и старался сверяться с официальной документацией Bash.
Если вы нашли ошибку в тексте, то смело правьте ее, при этом, желательно, сохраняя общую канву повествования и сохраняя общий стиль оформления.
См. также
правитьСсылки
править- Bash Reference Manual(англ.) — Официальное руководство. Проверено 22 ноября 2010 г. Архивировано из первоисточника 23 августа 2011.
- Bash Reference Manual — Перевод man-страницы от 2004 года.
Команда test → |