Linux Guide

Bash для администратора: первый скрипт

Пишем первый bash-скрипт: shebang, переменные и подстановка команд, условия if/else, циклы for/while, практический скрипт мониторинга диска, set -e.

Проверено: bash 5.x, Ubuntu 22.04/24.04

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.