Справочник по Bash: parameter expansion, специальные переменные, массивы, тесты, циклы, функции. Всё что нужно для написания надёжных shell-скриптов.
Переменные и expansion
Parameter Expansion
| Выражение | Результат |
|---|---|
| ${VAR} | Значение VAR |
| ${VAR:-default} | VAR если задан, иначе default (не присваивает) |
| ${VAR:=default} | VAR если задан, иначе присвоить default |
| ${VAR:?error msg} | VAR если задан, иначе вывести ошибку и выйти |
| ${VAR:+alt} | alt если VAR задан, иначе пусто |
| ${#VAR} | Длина строки |
| ${VAR:2:5} | Подстрока: 5 символов с позиции 2 |
| ${VAR^^} | Весь текст в ВЕРХНИЙ регистр |
| ${VAR,,} | Весь текст в нижний регистр |
| ${VAR^} | Первый символ в верхний регистр |
| ${VAR/old/new} | Заменить первое вхождение |
| ${VAR//old/new} | Заменить все вхождения |
| ${VAR#prefix} | Удалить кратчайший префикс (glob) |
| ${VAR##prefix} | Удалить длиннейший префикс |
| ${VAR%suffix} | Удалить кратчайший суффикс |
| ${VAR%%suffix} | Удалить длиннейший суффикс |
Специальные переменные
Special Parameters
| Переменная | Значение |
|---|---|
| $0 | Имя скрипта / оболочки |
| $1 .. $9 | Позиционные параметры |
| ${10} .. | Параметры ≥ 10 (нужны фигурные скобки) |
| $@ | Все параметры как отдельные слова (с кавычками) |
| $* | Все параметры как одна строка |
| $# | Количество параметров |
| $? | Код выхода последней команды |
| $$ | PID текущего процесса (shell) |
| $! | PID последнего фонового процесса |
| $_ | Последний аргумент предыдущей команды |
| $- | Текущие флаги оболочки |
Массивы
Arrays
| Выражение | Описание |
|---|---|
| arr=(alpha beta gamma) | Объявить массив |
| arr[0]="delta" | Присвоить элемент |
| arr+=("epsilon") | Добавить в конец |
| ${arr[0]} | Первый элемент |
| ${arr[-1]} | Последний элемент |
| ${arr[@]} | Все элементы (по отдельности) |
| ${arr[*]} | Все элементы (одна строка) |
| ${#arr[@]} | Длина массива |
| ${arr[@]:1:2} | Срез: 2 элемента с индекса 1 |
| unset arr[1] | Удалить элемент |
| declare -A map | Ассоциативный массив (hash) |
| map[key]="value" | Присвоить ключ |
| ${!map[@]} | Все ключи ассоциативного массива |
Тесты
Файловые операторы
| Флаг | Истина если |
|---|---|
| -e file | Существует (любой тип) |
| -f file | Обычный файл |
| -d file | Директория |
| -s file | Файл не пустой (size > 0) |
| -L file | Символическая ссылка |
| -r / -w / -x | Читаемый / записываемый / исполняемый |
| -O file | Принадлежит текущему пользователю |
| f1 -nt f2 | f1 новее f2 |
| f1 -ot f2 | f1 старее f2 |
Строковые и числовые операторы
| Выражение | Истина если |
|---|---|
| -z str | Строка пустая |
| -n str | Строка не пустая |
| str1 = str2 | Строки равны |
| str1 != str2 | Строки не равны |
| str =~ regex | Совпадает с regex (только [[ ]]) |
| n1 -eq n2 | Числа равны |
| n1 -ne n2 | Числа не равны |
| n1 -lt / -le / -gt / -ge n2 | < / ≤ / > / ≥ |
Условия и циклы
Управляющие конструкции
| Конструкция | Описание |
|---|---|
| if [[ cond ]]; then ...; elif ...; else ...; fi | Условный блок |
| [[ cond ]] && cmd | Выполнить cmd если истина |
| [[ cond ]] || cmd | Выполнить cmd если ложь |
| case "$v" in pat1) ...;; pat2|pat3) ...;; *) ...;; esac | Switch/case |
| for i in {1..10}; do ...; done | Range loop |
| for f in *.txt; do ...; done | Glob loop |
| for (( i=0; i<10; i++ )); do ...; done | C-style loop |
| for item in "${arr[@]}"; do ...; done | Array loop |
| while IFS= read -r line; do ...; done < file | Читать строки из файла |
| while IFS= read -r line; do ...; done < <(cmd) | Читать строки из команды |
| until [[ cond ]]; do ...; done | Until loop |
| break / continue | Выйти / продолжить цикл |
Функции
Functions
| Конструкция | Описание |
|---|---|
| myfunc() { ...; } | Объявить функцию |
| function myfunc { ...; } | Альтернативный синтаксис |
| local var="$1" | Локальная переменная (только в функции) |
| return 0 / return 1 | Код выхода функции |
| result=$(myfunc args) | Захватить вывод функции |
| myfunc "$@" | Передать все аргументы скрипта в функцию |
| declare -f myfunc | Показать определение функции |
| unset -f myfunc | Удалить функцию |