Переменные и кавычки
Главная тема, на которой спотыкаются все новички: пробелы и кавычки.
Переменная — это именованное хранилище для строки; в 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}.