Bash -- скрипты и автоматизация
Bash — командная оболочка Unix-систем и язык скриптов для автоматизации рутинных задач: сборки, деплоя, работы с файлами, запуска тестов.
Зачем нужно
Разработчик постоянно выполняет повторяющиеся команды: запустить тесты, собрать проект, задеплоить. Bash-скрипты заменяют ручные шаги одной командой. Понимание Bash необходимо для работы с CI/CD (GitHub Actions, GitLab CI), Docker, серверами — там скрипты используются повсеместно.
Где используется
package.jsonscripts: запуск команд через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; поведение непредсказуемо
Связанные темы
Ресурсы
- https://www.gnu.org/software/bash/manual/bash.html
- https://www.shellcheck.net/ — линтер для shell-скриптов
- https://devhints.io/bash — шпаргалка по Bash