Интерполяция строк

Тема дорожной карты · Bash

Интерполяция строк в Bash — это процесс встраивания значений переменных или вывода команд непосредственно в строку, чаще всего в контексте двойных кавычек с использованием синтаксиса $variable или ${variable}. Форма с фигурными скобками ${var} предпочтительна в shell-скриптах, когда имя переменной сразу за ней следуют буквы или цифры, которые иначе могли бы быть ошибочно приняты за часть имени, например ${filename}_backup.tar. Подстановка команды, записанная как $(command), является тесно связанной формой интерполяции строк, которая вставляет вывод дочернего процесса в окружающую строку во время выполнения. Правильная интерполяция строк в Bash предотвращает проблемы с разбиением слов и подстановкой имён файлов, возникающие при нераскавыченных расширениях, делая скрипты более безопасными и предсказуемыми в окружениях Linux. Понимание интерполяции строк — основа эффективного написания shell-скриптов и автоматизации Linux, поскольку практически каждый нетривиальный Bash-скрипт использует встраивание динамических значений в сообщения, пути и команды.

Как это работает

Интерполяция строк: name="value" (без пробелов вокруг =), используются как $name или ${name} (форма с фигурными даёт ${name}_suffix). Локальные в функциях: local x. Read-only: readonly. Экспортируемые (в подпроцессы): export NAME=value. Специальные: $0 (имя скрипта), $1-$9 (позиционные аргументы), $# (количество), $@ (все как отдельные слова), $* (все как одно), $? (последний exit-код), $$ (PID), $! (последний bg PID).

Когда применять

Всегда закавычивайте раскрытие переменных ("$x", не $x) — незакавыченные word-split по whitespace + glob-расширяются, ломаясь на именах файлов с пробелами. ${var:-default} — дефолт, ${var:?error} — требовать значение, ${var:+alt} — "alt, только если var задана". local внутри функций, чтобы не засорять parent-scope. ЗАГЛАВНЫЕ для env-vars + констант, lower для локалов.

Типичные ошибки

Ловушки Интерполяция строк: name = "value" с пробелами (парсится как команда); ЗАГЛАВНЫЕ для всего ("коллизии с env-переменными"); не используют local (переменные утекают к caller); echo $foo вместо echo "$foo" (word-splitting кусает).

Связанные понятия

Полезные ресурсы