Bash скрипты для начинающих: пошаговое руководство с примерами

Bash скрипты для начинающих: пошаговое руководство с примерами

Повторяющиеся операции отнимают время и внимание. Один‑два Bash‑скрипта могут избавить от монотонного кликанья в файловом менеджере, ускорить резервное копирование или автоматизировать развёртывание проектов. В этой статье — полный базовый набор: переменные, if, for, функции, массивы, обработка аргументов, отладка и практические сценарии.

Что такое Bash и почему он полезен

Bash (Bourne Again Shell) — стандартная командная оболочка в Linux, macOS, Unix‑подобных системах и Windows WSL. Она активно используется администраторами, DevOps‑инженерами, разработчиками и энтузиастами благодаря:

  • Доступности — предустановлена почти везде или устанавливается одной командой.
  • Интеграции — легко комбинируется с утилитами (grepawksed, curl).
  • Сценариям — скрипты хранятся в Git, запускаются из CI и по расписанию через cron .

Минимальная подготовка

Убедитесь, что:

  1. Файл начинается со строки‑шебанг #!/usr/bin/env bash.
  2. У файла есть разрешение на исполнение: chmod +x myscript.sh.
  3. Запуск возможен двумя способами:
    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‑функций.

Лучшие практики и инструменты

Заключение

Bash‑скрипты переводят повторяющиеся операции в простой текстовый формат, который легко читать, версионировать и передавать коллегам. Используя переменные, условия, циклы, функции и массивы, можно описать полные рабочие流程 — от резервного копирования до развёртывания контейнеров — и сохранить их в понятном виде.

Дальнейший рост умений связан с расширением инструментов: профилируйте скрипты утилитой time, пишите модульные тесты на ​bats, ускоряйте параллельные задачи с xargs ‑P или GNU parallel. Чем больше шаблонов и приёмов окажется под рукой, тем увереннее вы будете автоматизировать новые участки работы.

Полезные ссылки для дальнейшего чтения

bash shell скрипт cron автоматизация
Alt text
Обращаем внимание, что все материалы в этом блоге представляют личное мнение их авторов. Редакция SecurityLab.ru не несет ответственности за точность, полноту и достоверность опубликованных данных. Вся информация предоставлена «как есть» и может не соответствовать официальной позиции компании.

Твой код — безопасный?

Расскажи, что знаешь о DevSecOps.
Пройди опрос и получи свежий отчет State of DevOps Russia 2025.