Bash-скрипт — это файл с командами, которые выполняются последовательно. Разница с ручным вводом команд: скрипт можно запустить повторно, передать параметры и поставить на расписание. Пишем первый рабочий скрипт с реальной пользой.
Создать и запустить скрипт
# Создать файл
nano myscript.sh
# Сделать исполняемым
chmod +x myscript.sh
# Запустить
./myscript.sh
# или:
bash myscript.sh
Структура скрипта
#!/bin/bash
# ↑ shebang: какой интерпретатор использовать
# Это обязательная первая строка скрипта
# Комментарии начинаются с #
echo "Привет из скрипта" # Вывести текст
date # Текущая дата
whoami # Текущий пользователь
Переменные
#!/bin/bash
# Объявление
NAME="Alexander"
VERSION=1
DATE=$(date +%Y-%m-%d) # $(команда) — подстановка вывода команды
# Использование: всегда в двойных кавычках
echo "Имя: $NAME"
echo "Версия: $VERSION"
echo "Сегодня: $DATE"
# Встроенные переменные
echo "Имя скрипта: $0"
echo "Первый аргумент: $1"
echo "Второй аргумент: $2"
echo "Все аргументы: $@"
echo "Количество арг.: $#"
echo "PID скрипта: $$"
echo "Код выхода пред. команды: $?"
Условия if/else
#!/bin/bash
FILE="/etc/hostname"
if [ -f "$FILE" ]; then
echo "Файл $FILE существует"
else
echo "Файл $FILE не найден"
fi
# Сравнение строк
USER_INPUT="$1"
if [ "$USER_INPUT" = "hello" ]; then
echo "Привет!"
elif [ "$USER_INPUT" = "bye" ]; then
echo "Пока!"
else
echo "Неизвестная команда: $USER_INPUT"
fi
# Числовые сравнения
COUNT=5
if [ $COUNT -gt 3 ]; then # -gt = greater than
echo "Больше трёх"
fi
# -lt меньше, -eq равно, -ne не равно, -ge >=, -le <=
Совет: Пробелы внутри скобок
[ ] обязательны. [ -f $FILE ] — правильно. [-f $FILE] — ошибка синтаксиса.Циклы
#!/bin/bash
# for по списку
for SERVER in web01 web02 db01; do
echo "Проверяю $SERVER..."
ping -c 1 -q $SERVER > /dev/null && echo "OK" || echo "FAIL"
done
# for по диапазону
for i in {1..5}; do
echo "Итерация $i"
done
# while
COUNT=1
while [ $COUNT -le 5 ]; do
echo "Счётчик: $COUNT"
COUNT=$((COUNT + 1))
done
# Обработать файл построчно
while IFS= read -r LINE; do
echo "Строка: $LINE"
done < /etc/hosts
Практический скрипт: мониторинг диска
#!/bin/bash
# disk-check.sh — предупреждение когда диск заполнен > 80%
THRESHOLD=80
EMAIL="admin@example.com"
USAGE=$(df -h / | awk 'NR==2 {print $5}' | tr -d '%')
echo "Использование диска: ${USAGE}%"
if [ "$USAGE" -gt "$THRESHOLD" ]; then
echo "ПРЕДУПРЕЖДЕНИЕ: диск заполнен на ${USAGE}%!"
# Отправить письмо (если настроен mail)
# echo "Диск / заполнен на ${USAGE}%" | mail -s "Disk Alert" "$EMAIL"
else
echo "OK: диск заполнен на ${USAGE}% (порог ${THRESHOLD}%)"
fi
chmod +x disk-check.sh
./disk-check.sh
Код выхода и обработка ошибок
#!/bin/bash
set -e # выйти при ошибке любой команды
set -u # ошибка при необъявленной переменной
set -o pipefail # ошибка pipe если любая команда в нём упала
# Проверить код выхода вручную
if ! systemctl is-active nginx > /dev/null 2>&1; then
echo "Nginx не запущен!"
exit 1
fi
echo "Nginx запущен"
exit 0
Итог
Четыре элемента — переменные, условия, циклы, код выхода — покрывают большинство задач автоматизации. Следующий шаг: работа с файлами и строками, функции, и постановка скрипта на расписание через cron.