В прошлом уроке наш скрипт выполнял фиксированный набор команд. Но что если нужно проверять не /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 — передать переменную дочерним процессам. Локальные — строчными, экспортируемые — ЗАГЛАВНЫМИ.

Обсуждение урока

0
Комментарии видны всем. Чтобы участвовать в обсуждении, войдите или зарегистрируйтесь.
Модерация сообщества

Пожаловаться на комментарий

Расскажите модераторам, что именно требует внимания.