8.1 Что такое скрипт
Скрипт — это текстовый файл, содержащий последовательность команд, которые выполняются интерпретатором (shell).
Преимущества скриптов
Автоматизация
Выполнение повторяющихся задач без ручного ввода команд
Экономия времени
Сложные операции выполняются одной командой
Надежность
Исключение человеческих ошибок при выполнении задач
Shebang (#!/bin/bash)
Первая строка скрипта, которая указывает интерпретатор для выполнения скрипта.
#!/bin/bash
# Это комментарий
echo "Hello World"
Типы скриптов
Системные скрипты
- Автозапуск сервисов
- Резервное копирование
- Мониторинг системы
Пользовательские скрипты
- Автоматизация рутинных задач
- Обработка файлов
- Развертывание приложений
Популярные интерпретаторы:
•
•
•
•
•
#!/bin/bash
— Bash (самый популярный)•
#!/bin/sh
— POSIX shell•
#!/usr/bin/python3
— Python•
#!/usr/bin/perl
— Perl
8.2 Создание и запуск скриптов
Создание и запуск bash-скриптов — основа автоматизации в Linux.
Создание скрипта
nano hello.sh # создать скрипт в nano
# Или
vim hello.sh # создать скрипт в vim
Содержимое скрипта
#!/bin/bash
# Мой первый скрипт
echo "Привет, мир!"
echo "Текущая дата: $(date)"
echo "Текущий пользователь: $USER"
Сделать скрипт исполняемым
chmod +x hello.sh # добавить права на выполнение
ls -l hello.sh # проверить права
# -rwxr-xr-x 1 user group 123 Dec 15 10:30 hello.sh
Запуск скрипта
./hello.sh # запустить скрипт
# Или
bash hello.sh # запустить через bash
Проверка синтаксиса
bash -n script.sh # проверить синтаксис без выполнения
bash -x script.sh # выполнить с выводом команд
Отладка скрипта
# Добавить в скрипт для отладки:
set -x # включить отладку
echo "Отладочная информация"
set +x # выключить отладку
Безопасность: Всегда проверяйте содержимое скриптов перед запуском, особенно если они получены из интернета.
8.3 Переменные в bash
Переменные в bash позволяют хранить и использовать данные в скриптах.
Создание переменных
name="Иван" # создать переменную
age=25 # числовая переменная
echo "Привет, $name!" # использовать переменную
echo "Вам $age лет" # использовать переменную
Системные переменные
echo $HOME # домашний каталог
echo $USER # имя пользователя
echo $PWD # текущий каталог
echo $PATH # пути поиска команд
echo $0 # имя скрипта
Переменные окружения
export MY_VAR="значение" # создать переменную окружения
echo $MY_VAR # использовать переменную
env | grep MY_VAR # показать переменную окружения
Специальные переменные
echo $# # количество аргументов
echo $1 # первый аргумент
echo $2 # второй аргумент
echo $@ # все аргументы
echo $? # код возврата последней команды
Работа с переменными
# Проверка существования переменной
if [ -z "$MY_VAR" ]; then
echo "Переменная не задана"
fi
# Значение по умолчанию
echo ${MY_VAR:-"по умолчанию"}
# Длина строки
text="Hello"
echo ${#text} # выведет 5
Важно: В bash переменные не имеют типов. Все значения — строки. Для математических операций используются специальные конструкции.
8.4 Ввод данных
Команда read позволяет получать данные от пользователя во время выполнения скрипта.
Базовое использование read
#!/bin/bash
echo "Введите ваше имя:"
read name
echo "Привет, $name!"
Ввод с приглашением
read -p "Введите ваш возраст: " age
echo "Вам $age лет"
Скрытый ввод (для паролей)
read -s -p "Введите пароль: " password
echo "Пароль введен"
Ввод нескольких значений
read -p "Введите имя и возраст: " name age
echo "Имя: $name, Возраст: $age"
Ввод с таймаутом
if read -t 5 -p "Введите что-то за 5 секунд: " input; then
echo "Вы ввели: $input"
else
echo "Время истекло"
fi
Чтение из файла
# Читать файл построчно
while read line; do
echo "Строка: $line"
done < file.txt
Практический пример
#!/bin/bash
echo "=== Создание пользователя ==="
read -p "Имя пользователя: " username
read -s -p "Пароль: " password
echo
read -p "Полное имя: " fullname
echo "Создаем пользователя $username..."
# Здесь была бы команда создания пользователя
echo "Пользователь $username создан"
8.5 Подстановка команд
Подстановка команд позволяет использовать результат выполнения команды как значение переменной или аргумента.
Синтаксис подстановки
# Старый синтаксис (обратные кавычки)
current_date=`date`
echo "Сегодня: $current_date"
# Новый синтаксис (рекомендуется)
current_date=$(date)
echo "Сегодня: $current_date"
Использование в переменных
# Получить имя хоста
hostname=$(hostname)
echo "Имя компьютера: $hostname"
# Получить количество файлов
file_count=$(ls -1 | wc -l)
echo "Файлов в каталоге: $file_count"
# Получить размер каталога
dir_size=$(du -sh . | cut -f1)
echo "Размер каталога: $dir_size"
Использование в командах
# Создать резервную копию с датой
cp important.txt backup_$(date +%Y%m%d).txt
# Показать файлы, измененные сегодня
ls -la $(find . -mtime 0)
# Подсчитать строки в файлах
echo "Всего строк: $(cat *.txt | wc -l)"
Вложенные подстановки
# Получить имя каталога из полного пути
current_dir=$(basename $(pwd))
echo "Текущий каталог: $current_dir"
# Получить количество процессов
process_count=$(ps aux | wc -l)
echo "Процессов запущено: $process_count"
Практические примеры
#!/bin/bash
# Скрипт для создания резервной копии
backup_dir="backup_$(date +%Y%m%d_%H%M%S)"
mkdir "$backup_dir"
echo "Создаем резервную копию в $backup_dir"
cp -r /home/user/documents "$backup_dir/"
echo "Резервная копия создана"
echo "Размер: $(du -sh "$backup_dir" | cut -f1)"
Совет: Используйте
$()
вместо обратных кавычек, так как это более читаемо и поддерживает вложенность.
8.6 Математические операции
В bash есть несколько способов выполнения математических операций.
Арифметическое расширение $(( ))
a=10
b=5
result=$((a + b))
echo "Сумма: $result"
# Различные операции
echo "Сложение: $((a + b))" # 15
echo "Вычитание: $((a - b))" # 5
echo "Умножение: $((a * b))" # 50
echo "Деление: $((a / b))" # 2
echo "Остаток: $((a % b))" # 0
Команда expr
a=10
b=5
result=$(expr $a + $b)
echo "Результат: $result"
# Обратите внимание на пробелы вокруг операторов
echo "Умножение: $(expr $a \* $b)" # экранирование *
Команда bc (калькулятор)
# Простые вычисления
echo "2 + 3" | bc # 5
echo "10 / 3" | bc # 3
echo "scale=2; 10 / 3" | bc # 3.33 (2 знака после запятой)
# Сложные вычисления
echo "sqrt(16)" | bc # 4
echo "2^3" | bc # 8
Инкремент и декремент
counter=0
echo "Начальное значение: $counter"
counter=$((counter + 1))
echo "После увеличения: $counter"
counter=$((counter - 1))
echo "После уменьшения: $counter"
# Сокращенная запись
counter=$((counter++)) # постфиксный инкремент
counter=$((++counter)) # префиксный инкремент
Сравнения
a=10
b=5
if [ $a -gt $b ]; then
echo "$a больше $b"
fi
if [ $a -eq 10 ]; then
echo "$a равно 10"
fi
Практический пример
#!/bin/bash
# Калькулятор
read -p "Введите первое число: " num1
read -p "Введите второе число: " num2
read -p "Введите операцию (+, -, *, /): " op
case $op in
+) result=$((num1 + num2)) ;;
-) result=$((num1 - num2)) ;;
\*) result=$((num1 * num2)) ;;
/) result=$((num1 / num2)) ;;
*) echo "Неизвестная операция"; exit 1 ;;
esac
echo "Результат: $result"
Операторы сравнения:
•
•
•
•
•
•
•
-eq
— равно•
-ne
— не равно•
-gt
— больше•
-lt
— меньше•
-ge
— больше или равно•
-le
— меньше или равно