Bash (Bourne Again Shell) — командный интерпретатор и язык сценариев (shell scripting), стандартный для большинства Linux-дистрибутивов и macOS (до 2019 года). Является расширением оригинального sh (Bourne Shell, 1979). Bash — интерактивная оболочка для работы в терминале и язык для автоматизации: управление файлами, запуск программ, обработка текста, системное администрирование.
Основные конструкции
#!/bin/bash
# Переменные
NAME="server1"
echo "Hello, $NAME"
# Условие
if [ -f /etc/nginx/nginx.conf ]; then
echo "Nginx config exists"
fi
# Цикл
for host in web1 web2 web3; do
ssh $host "systemctl restart nginx"
done
# Функция
backup_db() {
mysqldump -u root "$1" > "/backup/$1.sql"
}
backup_db mydb
История
Bourne Shell (sh) создан Стивом Борном (Steve Bourne) в Bell Labs в 1979 году. В 1989 году Брайан Фокс (Brian Fox) написал Bash для проекта GNU как замену sh с расширенными возможностями. Bash 1.0 вышел в 1989 году. Bash 2.0 (1996) добавил массивы. Bash 4.0 (2009) — ассоциативные массивы. Bash 5.0 (2019) — улучшения переменных и производительности. С macOS Catalina (2019) стандартной оболочкой стала Zsh вместо Bash (из-за лицензии GPL vs BSD).
Bash в системном администрировании
Bash-скрипты — основной инструмент автоматизации на Linux-сервере:
- Cron-задачи для регулярного обслуживания: очистка логов, бэкапы, проверка доступности
- Деплой через RSYNC/SCP с SSH: копирование файлов на удалённый сервер
- Обработка вывода команд через pipe:
ps aux | grep nginx | awk '{print $2}' - Мониторинг и алертинг: скрипты, проверяющие состояние сервисов через systemctl
Bash vs sh vs Zsh
| Параметр | Bash 5.2 | sh (POSIX) | Zsh |
|---|---|---|---|
| POSIX-совместимость | Да | Эталон | Да |
| Массивы | Индексные + ассоциативные | Нет | Да |
| Автодополнение | Bash-completion | Минимальное | Расширенное (zsh-completions) |
| Интерактивный UX | Средний | Базовый | Высокий |
На что обращать внимание
Шаблоны для безопасных Bash-скриптов: всегда начинай с set -euo pipefail (выход при ошибке, необъявленных переменных, неудачном pipe). Кавычки обязательны для переменных: "$VAR", не $VAR — иначе пробелы в значении ломают скрипт. Для сложной логики (парсинг JSON, HTTP-запросы, работа с БД) используй Python — Bash не предназначен для сложной обработки данных. Проверяй скрипты через shellcheck.net перед запуском в продакшне.
История Bash
Bash (Bourne Again Shell) написан Брайаном Фоксом (Brian Fox) в 1989 году для проекта GNU как свободная замена sh (Bourne Shell, 1979). Версия 1.0 выпущена в 1989 году. Bash 2.0 (1996) добавил расширенные возможности программирования. Bash 3.0 (2004) — улучшенные регулярные выражения. Bash 4.0 (2009) — ассоциативные массивы. Bash 5.0 (2019) — расширенные возможности отладки. Apple заменила Bash на Zsh в macOS Catalina (2019) из-за лицензии GPLv3 (несовместима с политикой Apple). На серверах Bash остаётся стандартом де-факто.
Основные конструкции Bash-скриптов
#!/bin/bash
set -euo pipefail # Выход при ошибке, не инициализированная переменная — ошибка
# Переменные
NAME="world"
echo "Hello, ${NAME}!"
# Условие
if [[ -f /etc/nginx/nginx.conf ]]; then
echo "Nginx installed"
fi
# Цикл
for i in {1..5}; do
echo "Iteration $i"
done
# Функция
backup() {
local DIR="$1"
tar -czf "${DIR}-$(date +%Y%m%d).tar.gz" "$DIR"
}
backup /var/www
На что обращать внимание
Всегда добавляй set -euo pipefail в начало скриптов: -e прерывает при ненулевом коде выхода, -u — при необъявленной переменной, -o pipefail — при ошибке в пайпе. Заключай переменные в кавычки: "$VAR" вместо $VAR — пробелы в значении не ломают логику. Для сложной обработки данных (JSON, HTTP) используй Python. Проверяй скрипты через shellcheck.net. Автоматические задачи запускай через crontab или systemd timer.