В прошлом уроке наш скрипт выполнял фиксированный набор команд. Но что если нужно проверять не /var/log/syslog, а другой лог? Или не 5 последних ошибок, а 20? Каждый раз редактировать файл? Нет — для этого есть переменные.
Переменная в Bash — это имя, за которым хранится значение. Всё как в любом языке программирования, но с парой особенностей синтаксиса.
name="Linux"
echo $name
Linux
Создали переменную name со значением Linux. Обратились к ней через $name. Всё просто, но есть критически важное правило:
Напишем скрипт с переменными:
#!/bin/bash
log_file="/var/log/syslog"
error_count=5
echo "Последние $error_count ошибок из $log_file:"
grep -i "error" "$log_file" 2>/dev/null | tail -n "$error_count"
Теперь, чтобы изменить лог или количество ошибок, достаточно поправить две строки в начале — а не искать эти значения по всему скрипту.
Подстановка команд — $()**
В переменную можно записать не просто текст, а результат команды:
current_date=$(date)
echo "Сейчас: $current_date"
Сейчас: Tue Mar 25 16:30:00 UTC 2025
Конструкция $(команда) выполняет команду и подставляет её вывод. Можно использовать прямо внутри строки:
echo "На диске свободно: $(df -h / | tail -1 | awk '{print $4}')"
Кавычки: одинарные vs двойные**
В Bash кавычки — не украшение. Они меняют поведение:
name="мир"
echo "Привет, $name!" # Привет, мир!
echo 'Привет, $name!' # Привет, $name!
Видите разницу?
- Двойные кавычки
"..."— подставляют переменные и результаты команд. Текст «живой». - Одинарные кавычки
'...'— всё воспринимается буквально. Никаких подстановок. Текст «мёртвый».
Когда что использовать? Двойные — почти всегда. Одинарные — когда нужно сохранить спецсимволы как есть:
# Двойные — переменная подставится
echo "Домашняя директория: $HOME"
# Одинарные — нужен буквальный текст с долларом
echo 'Переменная записывается как $HOME'
Фигурные скобки ${}**
Иногда нужно чётко обозначить, где заканчивается имя переменной:
fruit="apple"
echo "I like ${fruit}s" # I like apples
echo "I like $fruits" # Пусто — Bash ищет переменную $fruits, а её нет
${fruit}s — явная граница: переменная fruit, потом буква s. Без скобок Bash подумает, что переменная называется fruits.
Переменные окружения**
Помимо переменных, которые вы создаёте сами, в системе уже есть десятки переменных окружения — они настраиваются системой при входе и доступны любой программе.
echo "Пользователь: $USER"
echo "Домашняя директория: $HOME"
echo "Текущая оболочка: $SHELL"
echo "Путь поиска команд: $PATH"
$PATH — самая важная из них. Это список директорий через двоеточие, в которых Bash ищет команды:
echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin
Когда вы пишете ls, Bash проходит по этим директориям и находит /usr/bin/ls. Именно поэтому ./hello.sh нужен с ./ — ваша домашняя директория не в $PATH.
Посмотреть все переменные окружения:
env
export — передать переменную дочерним процессам**
Обычная переменная видна только в текущем скрипте. Если скрипт запускает другой скрипт — тот её не увидит. Чтобы «передать» переменную дальше, нужен export:
# Без export — переменная локальная
db_host="localhost"
# С export — переменная станет доступна дочерним процессам
export db_host="localhost"
На практике export чаще всего встречается в файлах настройки (.bashrc, .profile) для настройки окружения при входе в систему.
Шпаргалка:
| Синтаксис | Что делает |
|---|---|
var="value" |
Создать переменную (без пробелов вокруг =!) |
$var или ${var} |
Подставить значение переменной |
$(команда) |
Подставить результат команды |
"..." |
Двойные кавычки — подстановка работает |
'...' |
Одинарные кавычки — всё буквально |
export var |
Сделать переменную доступной дочерним процессам |
env |
Показать все переменные окружения |
В следующем уроке — ввод и вывод: как скрипт может спрашивать у пользователя данные, красиво выводить результат и сообщать об успехе или ошибке через коды возврата.
Переменная: var="value" (без пробелов!). Подстановка: $var или ${var}. В кавычках — "$var", чтобы пробелы не ломали.
Подстановка команд: $(команда) — выполнить и подставить stdout как текст.
Кавычки: двойные "..." — подстановка работает. Одинарные '...' — всё буквально.
Переменные окружения — системные переменные ЗАГЛАВНЫМИ: $HOME, $USER, $PATH, $SHELL. Доступны всем процессам.
export — передать переменную дочерним процессам. Локальные — строчными, экспортируемые — ЗАГЛАВНЫМИ.