BASH кратко о сценариях.
https://t.me/sysadmins_articlesBASH — Bourne-Again SHell (что может переводится как «перерожденный шел», или «Снова шел Борна(создатель sh)»), самый популярный командный интерпретатор в юниксоподобных системах, в особенности в GNU/Linux. Ниже приведу ряд встроенных команд, которые мы будем использовать для создания своих скриптов.
Комментарии
Сценарии могут содержать комментарии. Комментарии – это операторы, их можно размещать в сценарии оболочки, но который игнорируется при исполнении. Комментарии должны начинаются с символа # и продолжаются до символа новой строки. Например:
#!/bin/bash # Сценарий выведет имя пользователя whoami
Переменные
Оболочка позволяет создавать и удалять переменные, а также выполнять операции над ними. Переменные в bash могут находиться в 3-х областях видимости:
Локальные переменные – это обычные переменные внутри одного сценария. Они не доступны другим программам и сценариям, которые запускаются с этой оболочки.
Объявляются переменные с помощью символа = (перед и после= нет пробелов), а к их значениям обращаются с помощью символа $:
name="Вася" echo $name # вывод значения unset name # вывод переменной
В bash есть много переменных окружения, которые достаточно часто встречаются в сценариях, например:
HOME - путь к домашнему каталогу пользователя; PATH - список каталогов, в которых оболочка ищет исполняемые файлы; PWD - путь к рабочему каталогу; RANDOM - формирует целое случайное число; HOSTNAME - имя компьютера, на котором выполняется оболочка.
Переменные оболочки – это переменные, которые устанавливаются оболочкой и необходимы ей для корректной работы. Эти переменные имеют имена порядкового номера ($ 1, $ 2, $ 3, …) и содержат аргументы, которые передавались сценарию при запуске, как:
./some_script.sh VAL1 VAL2 # внутри сценария $1='VAL1', $2='VAL2'
Массивы и списки
В bash также есть возможность работы с массивами. При работе с ними часто пользуются переменной окружения IFS – разделителя полей для входных строк (IFS – Input Field Separator).
По умолчанию IFS равен символу пробела, но может быть изменен для разбиения строки на элементы массива, например, запятыми. Объявить массив можно следующим образом:
files[0]=Гараж
files[1]=Котел
echo ${files[*]} # напечатает элементы массива без учета
IFS echo ${files[@]} # напечатает элементы массива с IFS в качестве разделителя
Получить доступ к элементу массива можно с помощью срезов: $ {arr: 0: 1}. Удалить первый элемент массива можно с помощью сдвига: shift arr. Добавить в элементы в массив: arr = (“$ {arr [@]}” “Item 1” “Item 2”).
Результаты операций
Присвоить переменной результат работы команды или арифметических операций можно с помощью апострофов, или конструкции $ (выражение):
now=`data +%T` # или now=$(data +%T) echo now # 14:06:24
Арифметические операции необходимо помещать в двойные скобки:
foo=$(( ((10 + 5*3) – 7) / 2 )) echo $foo #> 9
Потоки
Файл с которого происходит чтение, называют стандартным потоком ввода, а тот в который происходит запись, соответственно – стандартным потоком вывода. В bash есть три стандартных потока:
0 stdin ввод 1 stdout вивод 2 stderr поток ошибок
Для перенаправления потоков используют основные операторы:
> - перенаправление потока вывода в файл (файл будет создан, или перезаписан) >> - дописать поток вывода в конец файла; < - перенаправляет данные из файла в поток ввода; <<< - чтение данных из строки, вместо всего содержимого файла (работает для bash 3+) 2> - перенаправляет поток ошибок в файл (файл будет создан, или перезаписан) 2>> - дописать ошибки в конец файла.
Каналы
Стандартные потоки можно перенаправить не только в файлы, но и на вход других сценариев. Соединение потока вывода одной программы с потоком ввода другой называют каналом или пайпом (pipe).
Ниже приведен простой конвейер из трех команд: команда1 перенаправляет свой вывод на вход команды2, которая, в свою очередь, перенаправляет собственный вывод на вход команды3:
cmd1 | cmd2 | cmd3
Конвейеры
Конвейеры – это команды, которые соединены операторами ;,&&, ||для выполнения в определенной последовательности.
Условные операторы
В bash поддерживаются два оператора ветвления: if и case. Оператор if выполняет определенный блок указаний, в зависимости от условия.
Условие помещают в двойные квадратные скобки [[ … ]], которые bash рассматривает как один элемент с кодом выхода.
Внутри блока операторов помещенных в [[ ]] разрешается использовать операторы && и ||. Например:
# Однострочная запись
if [ ... ]; then echo "true"; else echo "false"; fi;
## Вложенные условия
if [ ... ] && [ ... ]; then
...
elif [[ ... && ... ]]; then
...
else
...
fi;
Если необходимо сделать выбор из нескольких альтернатив, пригодится оператор case. Принцип его работы:
case "$ext" in
(jpg|jpeg)
echo "Это изображение в формате jpeg."
;;
png)
echо "Это изображение в формате png"
;;
gif)
echo "А это ))"
*)
echo "Оу! Это вообще не изображение!"
;;
esac
В примере оператор проверяет значение переменной $ext на совпадение с одним из шаблонов и в случае совпадения выполнит соответствующий блок кода.
Циклы
Bash дает пользователю возможность организовывать циклическое выполнение инструкций при помощи циклов: *
while for *select
while
Оператор while описывается следующим образом:
while условие do
тело
done
Интерпретатор в первую очередь выполняет команды, описанные в условии. Если результат выполнения нулевой, то выполняется тело, а после ее выполнения, переход к следующей итерации, в противном случае происходит выход из цикла.
for
Цикл for выполняет тело для каждого элемента из списка. Синтаксис цикла for:
for имя in элемент1 элемент2 ... элементN do
тело
done
В качестве элементов обычно используют различные шаблоны (wildcards). Очень удобно применять for для прохождения по каталогам и выполнения операций над группой файлов.
select
Цикл select помогает организовать удобное меню выбора и применяется тогда, когда пользователь должен выбрать один элемент из предложенного списка. В общем цикл select имеет такой же синтаксис, как и цикл for:
select ответ in элемент1 элемент2 ... элементN do
тeло
done
При выполнении этого оператора, все элементы из списка высвечиваются на экране со своими порядковыми номерами в виде списка вариантов ответа, после списка выводится специальное приглашение для ввода.
Функции
Объявление функции имеет следующий вид:
Имя функции () {
команды
}
Имя функции # обращение к функции
Объявление функции обязательно должно предшествовать ее первый вызов. Обращение к функции происходит путем указания ее имени в качестве команды.
Функция может принимать аргументы и возвращать после своего выполнения результат – код выхода. Функция обращается к своим аргументам точно так же, как и к локальным переменным, с помощью позиционных переменных – $1, $2 и тд. Результат работы можно возвращать с помощью команды return.
Отладка сценариев
Оболочка дает несколько средств для отладки сценариев. Для активации режима отладки, он должен быть запущен с помощью специальных опций. Первая строка сценария должна иметь вид:
#!/bin/sh опция
Можно выбирать среди следующих функций:
–n - читать все команды, но не выполнять их; –v - выводить все строки по мере их обработки интерпретатором; *–x- выводить все команды и их аргументы по мере их выполнения.
Для отладки сценария частями, нужный фрагмент отмечают вызовом команды set с помощью соответствующей опции из таблицы.
Причем, для включения режима отладки, перед опцией указывают символ -, для отключения режима отладки используют +:
set –x # включаем режим отладки ... set +x # выключаем режим отладки