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

Резюме (Chapter Review)

Резюме

В этой главе было рассмотрено создание базовых сценариев оболочки в системе Linux. Сценарий оболочки (shell script) — это текстовый файл, интерпретируемый и выполняемый оболочкой bash. Сценарий оболочки содержит набор команд, автоматизирующих задачи и обрабатывающих данные. Сценарий оболочки состоит из следующих частей:

  • #!/bin/bash
  • #Комментарии
  • команды оболочки
  • exit 0

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

  • Ввести /bin/bash имя_файла_сценария.
  • Добавить право на выполнение файлу сценария с помощью утилиты chmod, а затем ввести имя файла сценария в командной строке.

Кроме того, можно добавить путь к файлу сценария в переменную окружения PATH пользователей, чтобы им не приходилось запоминать полный путь. В качестве альтернативы можно переместить файл сценария в каталог, уже включённый в переменную окружения PATH пользователей, например ~/bin.

Помимо выполнения команд из сценария, можно также считывать ввод от пользователя и присваивать его переменной с помощью команды read имя_переменной в сценарии. Переменные сценария не нужно объявлять, если в них будет записываться текст. Однако если необходимо считывать числа в переменную, которая будет обрабатываться именно как числа (например, для выполнения арифметических операций), нужно предварительно объявить её с помощью команды declare -i имя_переменной в сценарии.

В сценариях также можно использовать управляющие конструкции. Управляющие конструкции позволяют настроить сценарий так, чтобы он ветвился или выполнял циклы в зависимости от заданных условий. Для создания сценария с двумя ветвями выполнения можно использовать конструкцию if/then/else. Если указанное в конструкции условие истинно, выполняется один набор команд (под then). Если условие ложно, выполняются команды под частью else. Синтаксис конструкции if/then/else в сценарии:

if condition then
      commands
else
      commands
fi

Для проверки условия в конструкции if/then/else можно использовать команду test. Команда test поддерживает следующие параметры:

  • -d — Проверяет, существует ли указанный файл и является ли он каталогом.
  • -e — Проверяет, существует ли указанный файл, независимо от того, является он файлом или каталогом.
  • -f — Проверяет, существует ли указанный файл и является ли он обычным файлом.
  • -G — Проверяет, существует ли указанный файл и принадлежит ли он указанной группе.
  • -h или -L — Проверяет, существует ли указанный файл и является ли он символьной ссылкой.
  • -O — Проверяет, существует ли указанный файл и принадлежит ли он указанному идентификатору пользователя.
  • -r — Проверяет, существует ли указанный файл и предоставлено ли право на чтение.
  • -w — Проверяет, существует ли указанный файл и предоставлено ли право на запись.
  • -x — Проверяет, существует ли указанный файл и предоставлено ли право на выполнение.

Если в сценарии требуется более двух ветвей, можно использовать конструкцию case. Конструкция case — это расширенный вариант оператора if/then/else. С помощью конструкции case можно вычислить несколько условий и выполнять команды в зависимости от того, какое из них истинно. Конструкция case удобна как замена нескольких операторов if/then/else в сценарии. Синтаксис конструкции case:

case variable in
      condition_1 ) commands
      ;;
      condition_2 ) commands
      ;;
      condition_3 ) commands
      ;;
esac

В сценарии оболочки можно также использовать конструкции цикла. Конструкции цикла бывают трёх видов: цикл while, цикл until и цикл for.

Структура цикла while:

while condition
do
      script commands
done

Цикл while будет выполняться снова и снова до тех пор, пока условие не примет значение «ложь».

В сценарии можно использовать также цикл until. Цикл until выполняется снова и снова до тех пор, пока условие является ложным. Как только условие принимает значение «истина», цикл завершается. Структура цикла until:

until condition
do
      script commands
done

Можно также использовать цикл for, который выполняется заданное число раз. Для создания числовой последовательности, определяющей количество итераций цикла for, широко применяется команда seq. Команда seq поддерживает три варианта создания числовой последовательности:

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

Далее была рассмотрена обработка текстовых потоков для управления и изменения текста внутри сценария или конвейера. Были изучены следующие утилиты:

  • cut — Команда cut используется для вывода на стандартный вывод указанных столбцов или полей из файла. По умолчанию в качестве разделителя используется символ табуляции.
  • expand и unexpand — Команда expand обрабатывает текстовый поток и удаляет все символы табуляции, заменяя их указанным числом пробелов (по умолчанию восемью). Команда unexpand работает в противоположном направлении — преобразует пробелы в текстовом потоке обратно в символы табуляции.
  • fmt — Команда fmt используется для переформатирования текстового файла.
  • join и paste — Команда join выводит строку из каждого из двух указанных входных файлов, у которых совпадают поля объединения. Первое поле является полем объединения по умолчанию, разделённым пробельным символом. Команда paste работает аналогично команде join — она соединяет соответствующие строки из одного или нескольких файлов в столбцы. По умолчанию для разделения столбцов используется символ табуляции.
  • nl — Команда nl определяет количество строк в файле. При выполнении команды к выводу добавляется номер строки в начало каждой строки файла.
  • od — Команда od (octal dump) используется для вывода дампа файла, в том числе двоичных файлов. Эта утилита поддерживает вывод в нескольких форматах: восьмеричном, десятичном, с плавающей точкой, шестнадцатеричном и символьном.
  • pr — Команда pr используется для форматирования текстовых файлов перед печатью. Она форматирует файл с разбивкой на страницы, заголовками и столбцами. Заголовок содержит дату и время, имя файла и номер страницы.
  • sed и awk — Утилита sed является потоковым редактором. Она может использоваться для редактирования текста, поступающего из стандартного вывода другой команды. С помощью параметров командной строки можно выполнять поиск и замену, удалять текст и отображать результат на экране или записывать в файл. Команда awk также может использоваться для обработки текстового потока. Утилита awk рассматривает каждую строку, поступающую на её стандартный ввод, как запись. Каждое слово в строке считается полем. С помощью awk можно обращаться к конкретному полю (слову) в конкретной записи (строке).
  • sort — Команда sort сортирует строки текстового файла в алфавитном порядке.
  • split — Команда split разбивает входной файл на серию файлов (без изменения исходного файла).
  • tr — Команда tr используется для преобразования или удаления символов.
  • uniq — Команда uniq выводит или пропускает повторяющиеся строки.
  • wc — Команда wc выводит количество символов новой строки, слов и байтов в файле.

В заключение были рассмотрены подстановка команд и функции. Оболочка bash позволяет выполнить команду и вставить её вывод обратно в командную строку в качестве аргумента для другой команды. Это называется подстановкой команд (command substitution). В ситуациях, когда первая команда передаёт второй слишком много данных, можно использовать команду xargs для разбивки вывода на обрабатываемые фрагменты по 128 КБ.

Также были рассмотрены функции. Оболочка bash позволяет определять функции, которые можно использовать как из командной строки, так и внутри сценария. Определяя функцию, вы создаёте новую команду, которую можно вызывать и использовать как обычную внутреннюю или внешнюю команду. Функция содержит список команд для выполнения. Внутри функции можно использовать управляющие конструкции (такие как if/then/else).


Ускоренный обзор (Accelerated Review)

  • Сценарии оболочки — это текстовые файлы, содержащие различные команды для автоматизации задач и обработки данных.
  • Все сценарии оболочки начинаются с #!/bin/bash, указывающего, что для выполнения сценария следует использовать оболочку bash.
  • В начало каждого сценария следует добавлять комментарий с описанием его назначения.
  • Сценарии оболочки должны заканчиваться командой exit 0.
  • Сценарии оболочки можно запускать, выполнив /bin/bash имя_файла_сценария, или добавив право на выполнение файлу сценария.
  • Пользовательский ввод в сценарии можно считывать с помощью команды read имя_переменной.
  • Для расширения возможностей сценариев в них можно добавлять ветвящиеся конструкции.
  • Управляющие конструкции позволяют настроить сценарий так, чтобы он ветвился или выполнял циклы в соответствии с заданными условиями.
  • Для создания сценария с двумя ветвями выполнения можно использовать конструкцию if/then/else.
  • Если указанное в конструкции условие истинно, выполняется один набор команд (под then).
  • Если условие ложно, выполняются команды под частью else.
  • Для проверки условия в конструкции if/then/else можно использовать команду test.
  • Если требуется более двух ветвей, можно использовать конструкцию case.
  • Конструкция case позволяет вычислять несколько условий и выполнять набор команд в зависимости от того, какое из них истинно.
  • В сценарии оболочки можно также использовать конструкции цикла.
  • Конструкции цикла бывают трёх видов: цикл while, цикл until и цикл for.
  • Цикл while выполняется снова и снова до тех пор, пока указанное условие не примет значение «ложь».
  • В сценарии можно использовать также цикл until.
  • Цикл until выполняется снова и снова до тех пор, пока условие является ложным. Как только условие принимает значение «истина», цикл завершается.
  • Можно использовать также цикл for, который выполняется заданное число раз.
  • Для создания числовой последовательности, определяющей количество итераций цикла for, широко применяется команда seq.
  • Команда seq поддерживает три варианта создания числовой последовательности:
    • Если указано одно значение, последовательность начинается с единицы, увеличивается на единицу и заканчивается на указанном значении.
    • Если указаны два значения, последовательность начинается с первого значения, увеличивается на единицу и заканчивается на втором значении.
    • Если указаны три значения, последовательность начинается с первого значения, увеличивается на второе значение и заканчивается на третьем значении.
  • Обработка текстовых потоков позволяет управлять и изменять текст внутри сценария или конвейера.
  • Для обработки текстового потока можно использовать следующие утилиты: cut, expand, unexpand, fmt, join, paste, nl, od, pr, sed, awk, sort, split, tr, uniq, wc.
  • Подстановка команд позволяет выполнить команду и вставить её вывод обратно в командную строку в качестве аргумента для другой команды.
  • Команда xargs позволяет разбивать вывод на обрабатываемые фрагменты по 128 КБ.
  • Можно определять собственные функции, используемые как из командной строки, так и внутри сценария.
  • Определение функции создаёт новую команду, которую можно вызывать и использовать как обычную внутреннюю или внешнюю команду.