Повторяющиеся операции отнимают время и внимание. Один‑два Bash‑скрипта могут избавить от монотонного кликанья в файловом менеджере, ускорить резервное копирование или автоматизировать развёртывание проектов. В этой статье — полный базовый набор: переменные, if
, for
, функции, массивы, обработка аргументов, отладка и практические сценарии.
Что такое Bash и почему он полезен
Bash (Bourne Again Shell) — стандартная командная оболочка в Linux, macOS, Unix‑подобных системах и Windows WSL. Она активно используется администраторами, DevOps‑инженерами, разработчиками и энтузиастами благодаря:
- Доступности — предустановлена почти везде или устанавливается одной командой.
- Интеграции — легко комбинируется с утилитами (
grep
,awk
,sed
,curl
). - Сценариям — скрипты хранятся в Git, запускаются из CI и по расписанию через cron .
Минимальная подготовка
Убедитесь, что:
- Файл начинается со строки‑шебанг
#!/usr/bin/env bash
. - У файла есть разрешение на исполнение:
chmod +x myscript.sh
. - Запуск возможен двумя способами:
bash myscript.sh
или./myscript.sh
.
Режим строгих ошибок
Добавьте в начале скрипта:
set -euo pipefail
Параметры означают: прекращать работу при ошибке (-e
), считать необъявленные переменные ошибкой (-u
), не игнорировать ошибки в пайпах (pipefail
).
Переменные: фундамент гибкости
Объявление и использование
NAME="Мария"
echo "Привет, $NAME!"
BACKUP_DIR="/backups/$(date +%F)"
Командная подстановка
Выражение $(…)
подставляет вывод команды:
FILES=$(ls | wc -l)
echo "В каталоге $FILES файлов"
Чтение пользовательского ввода
read -rp "Введите путь до каталога: " DIR
echo "Содержимое $DIR:"
ls "$DIR"
Условные операторы if
Базовый шаблон:
if [[ -f "settings.cfg" ]]; then
echo "Конфигурация найдена"
else
echo "Файл не найден"
exit 1
fi
Расширенные примеры
- Проверка строки:
[[ -z "$VAR" ]]
— пустая ли строка. - Числа:
[[ $A -gt 10 ]]
— больше ли число$A
10. - Комбинация условий:
[[ -d "$DIR" && -w "$DIR" ]]
.
Циклы: for
, while
и арифметический for
for
по списку файлов
for file in *.log; do
gzip "$file"
done
for
по диапазону
for i in {1..5}; do
echo "Итерация $i"
done
Арифметический for ((…))
for ((i=0; i<10; i++)); do
printf "%02d " "$i"
done
echo
while
— чтение файла построчно
while IFS= read -r line; do
echo "-> $line"
done < data.txt
Функции: переиспользуем код
Синтаксис
greet() {
local user=$1 # переменная локальна
echo "Здравствуйте, $user!"
}
greet "Ольга"
Возврат статуса и значений
is_port_open() {
nc -z localhost "$1"
return $?
}
if is_port_open 22; then
echo "SSH доступен"
fi
Массивы и ассоциативные массивы
Обычные массивы
servers=(web01 web02 db01)
for host in "${servers[@]}"; do
ping -c1 "$host"
done
Ассоциативные массивы
declare -A ports=(
[ssh]=22
[http]=80
[db]=5432
)
for service in "${!ports[@]}"; do
echo "$service -> ${ports[$service]}"
done
Обработка аргументов скрипта
Позиционные параметры
#!/usr/bin/env bash
SRC=$1
DST=$2
cp -r "$SRC" "$DST"
getopts
— флаги и опции
usage() { echo "Использование: $0 -s путь_к_источнику -d путь_к_назначению"; }
while getopts ":s:d:" opt; do
case $opt in
s) SRC=$OPTARG ;;
d) DST=$OPTARG ;;
*) usage; exit 1 ;;
esac
done
[[ -z $SRC || -z $DST ]] && { usage; exit 1; }
cp -r "$SRC" "$DST"
Обработка ошибок и ловушки trap
Ловим выход скрипта
cleanup() {
echo "Завершение работы. Удаляю временные файлы..."
rm -f /tmp/mytemp.*
}
trap cleanup EXIT
Пример строгого режима + логирования
#!/usr/bin/env bash
set -euo pipefail
exec > >(tee -a "/var/log/myscript.log") 2>&1
Практические сценарии автоматизации
Сценарий 1. Резервное копирование каталогов с очисткой
#!/usr/bin/env bash
set -euo pipefail
SRC="/var/www"
DST="/backups/$(date +%F)"
mkdir -p "$DST"
tar -czf "$DST/www.tgz" "$SRC"
find /backups -type f -mtime +7 -delete
Сценарий 2. Массовое изменение размера изображений
#!/usr/bin/env bash
set -euo pipefail
QUALITY=85
for img in *.jpg; do
convert "$img" -resize 1280x -quality $QUALITY "small_$img"
done
Сценарий 3. Пересборка Docker‑контейнеров из списка
#!/usr/bin/env bash
images=(api frontend worker)
for image in "${images[@]}"; do
docker build -t "myorg/$image:latest" "./$image"
done
Сценарий 4. Отправка отчёта о свободном месте в Telegram
#!/usr/bin/env bash
set -euo pipefail
TOKEN="YOUR_TELEGRAM_BOT_TOKEN"
CHAT_ID="123456"
USAGE=$(df -h / | awk 'NR==2 {print $(NF-1)}')
curl -s -X POST
"https://api.telegram.org/bot$TOKEN/sendMessage"
-d "chat_id=$CHAT_ID&text=Занято места: $USAGE"
Запуск по расписанию через cron
# открыть файл расписания
crontab -e
# каждый день в 02:30 выполнять backup.sh
30 2 * * * /usr/local/bin/backup.sh
Проверить выражение удобно на Crontab Guru .
Отладка и тестирование
Трассировка
bash -x script.sh
Для более детального вывода задайте PS4='+ $BASH_SOURCE:$LINENO '
перед set -x
.
Юнит‑тесты с
bats‑core — удобный фреймворк для проверки Bash‑функций.
Лучшие практики и инструменты
- ShellCheck — статический анализ кода ( онлайн‑версия ).
- explainshell — построчное объяснение команд ( сервис ).
- devhints/bash — удобная шпаргалка ( devhints.io/bash ).
- GitHub Actions — запуск Bash‑скриптов в CI ( документация ).
Заключение
Bash‑скрипты переводят повторяющиеся операции в простой текстовый формат, который легко читать, версионировать и передавать коллегам. Используя переменные, условия, циклы, функции и массивы, можно описать полные рабочие流程 — от резервного копирования до развёртывания контейнеров — и сохранить их в понятном виде.
Дальнейший рост умений связан с расширением инструментов: профилируйте скрипты утилитой time
, пишите модульные тесты на bats, ускоряйте параллельные задачи с xargs ‑P
или GNU parallel. Чем больше шаблонов и приёмов окажется под рукой, тем увереннее вы будете автоматизировать новые участки работы.