Перейти к содержанию

Практическое написание сценариев командной оболочки 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.

Если вы нашли ошибку в тексте, то смело правьте ее, при этом, желательно, сохраняя общую канву повествования и сохраняя общий стиль оформления.

См. также

[править]

Ссылки

[править]



Команда test →