Переменные и кавычки

Главная тема, на которой спотыкаются все новички: пробелы и кавычки.

Переменная — это именованное хранилище для строки; в Bash всё хранится как текст.

Присваивание без пробелов

Переменной присваивают значение через =, и пробелы вокруг знака запрещены. Читают переменную через $.

name="Аня"
greeting="Привет"
echo "$greeting, $name!"

Вывод:

Привет, Аня!

Если поставить пробел — name = "Аня" — Bash решит, что name это команда, а = и "Аня" её аргументы, и выдаст command not found. Это самая частая ошибка.

Три режима кавычек

Кавычки в Bash работают по-разному, и это важно понимать.

ЗаписьЧто происходит
"$name"двойные: переменные подставляются
'$name'одинарные: всё буквально, без подстановки
$nameбез кавычек: подстановка + разбиение по пробелам
name="Большой Босс"
echo "$name"
echo '$name'
echo $name

Вывод:

Большой Босс
$name
Большой Босс

В последней строке вывод выглядит так же, но без кавычек значение разбилось на два слова — echo просто склеил их через пробел. С другими командами это привело бы к багам.

Зачем нужны фигурные скобки

Иногда нужно явно отделить имя переменной от текста рядом:

file="report"
echo "${file}_2026.txt"

Вывод:

report_2026.txt

Без скобок $file_2026 Bash попытается прочитать несуществующую переменную file_2026.

Как работает под капотом

Перед запуском команды Bash проходит этап «раскрытия» (expansion): находит $имя, заменяет на значение, а затем — если значение НЕ в двойных кавычках — выполняет «разбиение слов» (word splitting) по пробелам и табам, и раскрытие шаблонов вроде *. Двойные кавычки отключают разбиение и шаблоны, но оставляют подстановку переменных. Одинарные отключают вообще всё. Поэтому правило профи: всегда заключайте переменные в двойные кавычки, если только специально не нужно разбиение.

Частые ошибки

  • Пробелы вокруг =. x = 5 — ошибка, нужно x=5.
  • Переменная без кавычек с пробелами или пустая. rm $file при file="a b" удалит два файла, а при пустом file — вообще все аргументы посыплются. Пишите rm "$file".
  • Доллар при присваивании. Слева от = доллар не ставится: name=Аня, а не $name=Аня.

Итог

  • Присваивание — name=значение без пробелов вокруг =, чтение — $name.
  • Двойные кавычки подставляют переменные, одинарные — нет, без кавычек идёт разбиение по пробелам.
  • Защитное правило: переменные всегда в двойных кавычках, имя можно уточнять через ${name}.
Проверьте себя
1. Почему строка count = 10 вызовет ошибку?
A10 — слишком большое число
BИз-за пробелов вокруг = Bash примет count за команду
CНужны кавычки вокруг 10
DПеременные нельзя называть count
2. Что выведет echo '$name', если name="Аня"?
AАня
B$name
CПустую строку
DОшибку
3. Зачем переменные заключают в двойные кавычки, как "$file"?
AДля красоты
BЧтобы отключить подстановку
CЧтобы избежать разбиения значения по пробелам и раскрытия шаблонов
DКавычки обязательны всегда