Parameter expansion
Тема дорожной карты · Bash
Расширение параметров — одна из наиболее мощных возможностей Bash, позволяющая манипулировать значениями переменных непосредственно в оболочке без создания внешних процессов. Базовая форма ${var} извлекает значение переменной, а расширенные формы, такие как ${var:-default}, ${var:=default} и ${var:?error}, предоставляют подстановку значений по умолчанию и обработку ошибок, необходимые для надёжных shell-скриптов на Linux. Формы расширения параметров на основе шаблонов, такие как ${var#prefix}, ${var##prefix}, ${var%suffix} и ${var%%suffix}, выполняют удаление префиксов и суффиксов, а ${var/pattern/replacement} обрабатывает встроенную замену строк — всё это без накладных расходов на вызов sed или awk. Bash также поддерживает ${#var} для получения длины строки и ${var:offset:length} для извлечения подстрок, делая расширение параметров комплексным инструментарием обработки строк для рекомендуемых практик shell-скриптов и POSIX-совместимой автоматизации. Освоение расширения параметров сокращает вызовы внешних команд, улучшает производительность скриптов и является ключевым навыком для любого практика Bash shell-скриптов на Linux.
Как это работает
Parameter expansion: 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 для локалов.
Типичные ошибки
Ловушки Parameter expansion: name = "value" с пробелами (парсится как команда); ЗАГЛАВНЫЕ для всего ("коллизии с env-переменными"); не используют local (переменные утекают к caller); echo $foo вместо echo "$foo" (word-splitting кусает).