Командная строка

Скрипты автоматизации

Написание Bash-скриптов для автоматизации задач

Основы Bash-скриптов

#!/bin/bash
# Это комментарий

# Вывод текста
echo "Hello, World!"

# Переменные
NAME="SAIKYO"
echo "Welcome to $NAME OS"

# Чтение ввода
read -p "Enter your name: " USERNAME
echo "Hello, $USERNAME"

Запуск скрипта

# Сделать исполняемым
chmod +x script.sh

# Запустить
./script.sh
bash script.sh

Переменные

#!/bin/bash

# Присваивание (без пробелов!)
VAR="value"
NUMBER=42

# Использование
echo $VAR
echo ${VAR}
echo "${VAR}_suffix"

# Специальные переменные
echo $0          # имя скрипта
echo $1          # первый аргумент
echo $#          # количество аргументов
echo $@          # все аргументы
echo $?          # код возврата последней команды
echo $$          # PID текущего процесса

# Подстановка команд
DATE=$(date +%Y-%m-%d)
FILES=`ls -1 | wc -l`

Условия

#!/bin/bash

# if-then-else
if [ "$1" = "hello" ]; then
    echo "Hello!"
elif [ "$1" = "bye" ]; then
    echo "Goodbye!"
else
    echo "Unknown command"
fi

# Сравнение чисел
if [ $NUM -eq 10 ]; then echo "Equal"; fi
if [ $NUM -ne 10 ]; then echo "Not equal"; fi
if [ $NUM -gt 10 ]; then echo "Greater"; fi
if [ $NUM -lt 10 ]; then echo "Less"; fi
if [ $NUM -ge 10 ]; then echo "Greater or equal"; fi
if [ $NUM -le 10 ]; then echo "Less or equal"; fi

# Сравнение строк
if [ "$STR" = "value" ]; then echo "Equal"; fi
if [ "$STR" != "value" ]; then echo "Not equal"; fi
if [ -z "$STR" ]; then echo "Empty"; fi
if [ -n "$STR" ]; then echo "Not empty"; fi

# Проверка файлов
if [ -f "/path/file" ]; then echo "File exists"; fi
if [ -d "/path/dir" ]; then echo "Directory exists"; fi
if [ -r "/path/file" ]; then echo "Readable"; fi
if [ -w "/path/file" ]; then echo "Writable"; fi
if [ -x "/path/file" ]; then echo "Executable"; fi

# Логические операторы
if [ $A -gt 0 ] && [ $B -gt 0 ]; then echo "Both positive"; fi
if [ $A -gt 0 ] || [ $B -gt 0 ]; then echo "At least one positive"; fi

Циклы

#!/bin/bash

# for
for i in 1 2 3 4 5; do
    echo "Number: $i"
done

for file in *.txt; do
    echo "Processing: $file"
done

for i in {1..10}; do
    echo $i
done

for ((i=0; i<10; i++)); do
    echo $i
done

# while
COUNT=0
while [ $COUNT -lt 5 ]; do
    echo $COUNT
    ((COUNT++))
done

# Чтение файла построчно
while IFS= read -r line; do
    echo "$line"
done < file.txt

# until
until [ $COUNT -ge 5 ]; do
    echo $COUNT
    ((COUNT++))
done

Функции

#!/bin/bash

# Определение функции
greet() {
    echo "Hello, $1!"
}

# Вызов
greet "World"

# Функция с возвратом
add() {
    local result=$(($1 + $2))
    echo $result
}

SUM=$(add 5 3)
echo "Sum: $SUM"

# Локальные переменные
my_function() {
    local LOCAL_VAR="local"
    GLOBAL_VAR="global"
}

Обработка ошибок

#!/bin/bash

# Выход при ошибке
set -e

# Выход при использовании неопределённой переменной
set -u

# Проверка кода возврата
if ! command; then
    echo "Command failed"
    exit 1
fi

# Trap для очистки
cleanup() {
    echo "Cleaning up..."
    rm -f /tmp/tempfile
}
trap cleanup EXIT

Полезные примеры

Резервное копирование

#!/bin/bash
DATE=$(date +%Y-%m-%d)
BACKUP_DIR="/backup"
SOURCE="/home"

tar -czvf "$BACKUP_DIR/home-$DATE.tar.gz" "$SOURCE"
find "$BACKUP_DIR" -name "home-*.tar.gz" -mtime +7 -delete

echo "Backup completed: home-$DATE.tar.gz"

Мониторинг диска

#!/bin/bash
THRESHOLD=80
USAGE=$(df / | tail -1 | awk '{print $5}' | tr -d '%')

if [ $USAGE -gt $THRESHOLD ]; then
    echo "Warning: Disk usage is ${USAGE}%"
    # Отправить уведомление
fi