Введение / Зачем это нужно
Переменные оболочки (shell variables) — это фундаментальный механизм Linux-терминала, позволяющий хранить и повторно использовать данные: пути к файлам, настройки программ, результаты команд. Они являются основой для написания эффективных скриптов на Bash/Zsh, настройки среды разработки и автоматизации рутинных задач. Понимание работы с переменными кардинально повышает эффективность работы в командной строке.
Требования / Подготовка
- Доступ к терминалу Linux (любого дистрибутива: Ubuntu, Fedora, Debian, Arch и т.д.).
- Базовое знакомство с командной строкой.
- Используемая оболочка (shell) по умолчанию — Bash (рекомендуется) или Zsh. Проверить можно командой
echo $SHELL. - Права на выполнение стандартных команд (
echo,export,unset,set,env).
Шаг 1: Объявление и присвоение значения переменной
Создание переменной выполняется простым присваиванием. Крайне важно: вокруг знака равенства = не должно быть пробелов. Имя переменной может содержать буквы, цифры и символ подчёркивания (_), но не может начинаться с цифры.
# Простое объявление
GREETING="Привет, мир!"
# Можно присвоить результат команды (используем команду substitution)
CURRENT_DATE=$(date +%Y-%m-%d)
USER_HOME=$(echo $HOME) # $HOME — уже существующая системная переменная
# Пример с числом (числа в shell — это тоже строки, но для арифметики есть специальный синтаксис)
COUNTER=10
💡 Совет: Всегда заключайте значение в кавычки (
"), особенно если оно содержит пробелы или специальные символы. Это предотвратит ошибки интерпретации.
Шаг 2: Чтение и использование значения
Чтобы получить значение переменной, поставьте перед её именем символ доллара $. Для сложных случаев (например, чтобы отделить имя переменной от последующего текста) используйте фигурные скобки ${}.
# Простое чтение
echo $GREETING
# Вывод: Привет, мир!
# Использование в строке с ${}
echo "Сегодня: ${CURRENT_DATE}, пользователь: $USER"
# Вывод: Сегодня: 2026-02-17, пользователь: fixpedia
# Конкатенация (сложение строк)
PATH_SUFFIX="/myapp/bin"
FULL_PATH="/usr/local"$PATH_SUFFIX
echo $FULL_PATH
# Вывод: /usr/local/myapp/bin
# Использование в команде
LIST_FILE="filelist.txt"
wc -l $LIST_FILE
Шаг 3: Экспорт переменных (сделать видимой для других программ)
По умолчанию переменная существует только в текущей оболочке. Чтобы она стала переменной окружения (environment variable) и была доступна для любых программ и скриптов, запускаемых из этой оболочки, её нужно экспортировать.
# 1. Объявить
MY_APP_CONFIG="/etc/myapp/config.conf"
# 2. Экспортировать
export MY_APP_CONFIG
# Проверить, что переменная окружения
env | grep MY_APP_CONFIG
# Вывод: MY_APP_CONFIG=/etc/myapp/config.conf
# Теперь любой скрипт или программа, запущенная из этого терминала,
# сможет прочитать $MY_APP_CONFIG.
Можно объявить и экспортировать переменную одной командой:
export API_KEY="secret123"
Шаг 4: Специальные типы переменных
4.1. Только для чтения (readonly)
После объявления такой переменной её значение нельзя изменить или удалить. Полезно для констант.
readonly APP_VERSION="2.1.0"
APP_VERSION="3.0.0" # Ошибка! bash: APP_VERSION: readonly variable
4.2. Локальные переменные в функциях (local)
Внутри функции (или скрипта) переменная, объявленная как local, видна только внутри этой функции/скрипта и не затирает глобальную переменную с таким же именем.
GLOBAL_VAR="я глобальная"
my_function() {
local GLOBAL_VAR="я локальная"
echo "Внутри функции: $GLOBAL_VAR"
}
my_function
echo "Снаружи функции: $GLOBAL_VAR"
# Вывод:
# Внутри функции: я локальная
# Снаружи функции: я глобальная
Шаг 5: Просмотр и удаление переменных
- Просмотр всех переменных (локальных и окружения):
set - Просмотр только переменных окружения:
envилиprintenv - Удаление переменной:
unset ИМЯ_ПЕРЕМЕННОЙunset GREETING echo $GREETING # Вывод пустой строки
Шаг 6: Работа со встроенными и специальными переменными
Оболочка предоставляет множество полезных встроенных переменных. Вот ключевые:
| Переменная | Значение | Пример использования |
|---|---|---|
$? | Код возврата последней выполненной команды (0 = успех) | if [ $? -eq 0 ]; then echo "OK"; fi |
$# | Количество аргументов, переданных скрипту/функции | Внутри скрипта: echo "Аргументов: $#" |
$@, $* | Все аргументы, переданные скрипту/функции | for arg in "$@"; do ...; done |
$0 | Имя самого скрипта или оболочки | echo "Запущен скрипт: $0" |
$$ | PID (идентификатор процесса) текущей оболочки | echo "Мой PID: $$" |
$! | PID последнего фонового процесса | sleep 10 & echo $! |
$HOME | Домашний каталог текущего пользователя | cd $HOME |
$PWD | Текущий рабочий каталог | echo "Вы находитесь в: $PWD" |
$PATH | Список каталогов, где система ищет исполняемые файлы | echo $PATH |
Проверка результата
- Создайте переменную:
TEST_VAR="success". - Экспортируйте её:
export TEST_VAR. - Запустите дочерний процесс (например, новый под-терминал или скрипт), который выводит
echo $TEST_VAR. Вы должны увидетьsuccess. - Удалите переменную:
unset TEST_VAR. - Повторите шаг 3 — вывод должен быть пустым.
Возможные проблемы
- Ошибка
command not foundпри присваивании. Причина: пробелы вокруг=. Решение:VAR=value, а неVAR = value. - Переменная не видна в скрипте. Причина: вы не экспортировали её (
export). Решение: используйтеexport VARперед запуском скрипта или объявите внутри скрипта. - Пустое значение при чтении. Причина: переменная не была объявлена, была удалена (
unset) или её имя написано с ошибкой (регистр имеет значение!). Решение: проверьте имя командойecho $ИМЯилиenv | grep ИМЯ. - Проблемы с пробелами и спецсимволами. Причина: значение не заключено в кавычки. Решение: всегда используйте
VAR="значение с пробелом"илиVAR='значение с $спецсимволом'(одинарные кавычки отключают подстановку). readonly variableпри попытке изменения. Причина: переменная была объявлена какreadonly. Решение: создайте новую переменную с другим именем или не используйтеreadonlyдля тех, что нужно менять.