Bash -- скрипты и автоматизация

Bash — командная оболочка Unix-систем и язык скриптов для автоматизации рутинных задач: сборки, деплоя, работы с файлами, запуска тестов.

Зачем нужно

Разработчик постоянно выполняет повторяющиеся команды: запустить тесты, собрать проект, задеплоить. Bash-скрипты заменяют ручные шаги одной командой. Понимание Bash необходимо для работы с CI/CD (GitHub Actions, GitLab CI), Docker, серверами — там скрипты используются повсеместно.

Где используется

  • package.json scripts: запуск команд через npm run
  • CI/CD pipelines: GitHub Actions, GitLab CI, Jenkins
  • Деплой на сервер: rsync, ssh, перезапуск сервисов
  • Автоматизация локальной разработки: генерация файлов, миграции, seed-данные
  • Docker: ENTRYPOINT и CMD в Dockerfile

Основной контент

Основы синтаксиса

#!/usr/bin/env bash
# Shebang обязателен для исполняемых скриптов

# Переменные (без пробелов вокруг =)
NAME="World"
echo "Hello, $NAME!"

# Аргументы скрипта
echo "Первый аргумент: $1"
echo "Все аргументы: $@"
echo "Количество аргументов: $#"

# Условие
if [ "$1" = "prod" ]; then
  echo "Production mode"
else
  echo "Development mode"
fi

# Цикл
for file in *.js; do
  echo "Обрабатываем $file"
done

Практический скрипт деплоя

#!/usr/bin/env bash
set -e  # Прерваться при любой ошибке

echo "=== Сборка проекта ==="
npm run build

echo "=== Запуск тестов ==="
npm test

echo "=== Деплой ==="
rsync -avz dist/ user@server:/var/www/app/

echo "=== Готово ==="

Полезные команды

# Работа с файлами
ls -la                    # список файлов
cp -r src/ backup/        # копирование папки
rm -rf dist/              # удаление
mkdir -p src/components   # создать папку (с родителями)

# Переменные окружения
export NODE_ENV=production
echo $PATH

# Перенаправление вывода
npm build > build.log 2>&1   # stdout и stderr в файл
npm test 2>/dev/null          # игнорировать stderr

# Проверки
[ -f "package.json" ] && echo "есть"   # файл существует
[ -d "dist" ] || mkdir dist             # создать если нет

npm scripts как оболочка

{
  "scripts": {
    "build": "bash scripts/build.sh",
    "deploy": "NODE_ENV=production bash scripts/deploy.sh",
    "clean": "rm -rf dist && mkdir dist"
  }
}

Частые ошибки

  • Пробелы вокруг =NAME = "value" — ошибка синтаксиса; только NAME="value"
  • Не указан set -e — скрипт продолжает выполнение после ошибки; деплой идёт на сломанной сборке
  • Пути с пробеламиrm $FILE упадёт если в имени файла пробел; всегда кавычки: rm "$FILE"
  • Забытый shebang — скрипт выполняется текущей оболочкой пользователя, а не bash; поведение непредсказуемо

Связанные темы

Ресурсы