Обрезка пробелов
Тема дорожной карты · Bash
Удаление ведущих и завершающих пробелов из строки — распространённая задача в Bash-скриптах, особенно при обработке входных данных. Этот процесс позволяет улучшить чистоту данных, избавляясь от лишних пробелов, что важно для корректной работы скриптов. Bash предлагает несколько методов для обработки строк, начиная от простого использования встроенных операторов до применения внешних утилит.
Идиоматический подход Bash для удаления ведущих пробелов — trimmed="${var#"${var%%[! ]*}"}" через вложенное расширение параметров. Этот метод эффективен и экономичен, так как не требует запуска дополнительных процессов. Однако, многие авторы скриптов предпочитают более читаемую форму read -r trimmed <<< "$var", которая использует тот факт, что read по умолчанию удаляет ведущие и завершающие пробелы, когда IFS — стандартный пробел-табуляция-перевод строки.
Для обрезки пробелов в скриптах автоматизации Linux awk '{$1=$1}1' и sed 's/^[[:space:]]*//; s/[[:space:]]*$//' являются надёжными и POSIX-переносимыми альтернативами. Эти команды создают дочерний процесс, что может быть неэффективно для больших объемов данных или при высокой частоте вызовов. В Bash 4.0+ с поддержкой расширенных глобов (активируется через shopt -s extglob) доступны ${var##+([[:space:]])} и ${var%%+([[:space:]])} для прямой обрезки без внешних инструментов. Это предпочтительная практика для производительных Bash-скриптов, так как она позволяет избежать создания дополнительных процессов.
Знание нескольких методов обрезки — встроенных и внешних — даёт гибкость при выборе подходящего подхода в зависимости от требований переносимости и производительности в shell-скриптах Linux.
Как это работает
Обрезка пробелов: substring ${var:offset:length}; длина ${#var}; удалить префикс ${var#pattern} (кратчайший), ${var##pattern} (длиннейший); удалить суффикс ${var%pattern}, ${var%%pattern}; замена ${var/pattern/replacement} (первая), ${var//pattern/replacement} (все); upper ${var^^}, lower ${var,,}. Конкатенация: просто "${a}${b}". Нет .-оператора как в Perl.
Когда применять
Parameter expansion — для простых string-операций; быстрее запуска sed на каждую. basename/dirname — для путей (или ${var##*/} / ${var%/*} inline). Для сложного regex sed или внешние тулы яснее встроенных bash-операторов.
Типичные ошибки
Ловушки Обрезка пробелов: ${var#*/} — это glob-match, не regex (новички путаются — * матчит что угодно); ${var/-/_} заменяет только первый дефис (используйте // для всех); ${var^^} и ${var,,} требуют bash 4 (macOS bash 3.2 не имеет ни того, ни другого).