Гид по технологиям

Манипулирование строками в Bash

6 min read Bash Обновлено 18 Dec 2025
Манипулирование строками в Bash
Манипулирование строками в Bash

Ноутбук на синем фоне с открытым терминалом Linux.

Быстрые ссылки

  • Создание и работа со строковыми переменными
  • Манипуляции со строками
  • Извлечение подстрок
  • Замена подстрок
  • Совет по практическому использованию

Введение

Linux богат внешними инструментами для работы с текстом: awk, grep, sed, cut и другие. Однако Bash сам по себе может решить множество повседневных задач без запуска отдельного процесса. Это удобно для коротких скриптов, скриптов, которые будут выполняться на чужих машинах, или когда хочется избежать накладных расходов на вызов внешних команд.

Важно: для «тяжёлых» текстовых преобразований выбирайте специализированные утилиты — они более выразительны и часто быстрее для больших объёмов данных. Если же задача небольшая или критична портируемость, встроенные средства Bash — хороший выбор.

Создание и работа со строковыми переменными

Объявление переменной в Bash простое: имя, знак равенства и значение. Если в значении есть пробелы, используйте одинарные или двойные кавычки. Нельзя ставить пробелы вокруг знака =.

my_string="Hello, How-To Geek World."

Вывести значение переменной:

echo $my_string

После создания имя переменной попадёт в подсказку таб‑дополнения в интерактивной сессии.

Константные (только для чтения) переменные

Для объявления переменной только для чтения используется команда declare -r. Это предотвращает случайную переназначение значения.

declare -r read_only_var="This is an immutable string!"

Если попытаться изменить read_only_var, Bash выдаст ошибку.

Вывод в терминал

Для вывода используйте echo или printf. В командной строке удобно комбинировать собственные строки и переменные окружения:

user_account="Your user account is:"

echo $user_account $USER

Конкатенация строк

Оператор += добавляет к строке новую часть (конкатенация):

user_account="Your user account is:"
user_account+=$USER
echo $user_account

Обратите внимание: пробелы не вставляются автоматически. При необходимости добавьте пробел явно:

user_account="Your user account is: "
user_account+=$USER

Чтение ввода от пользователя

read считывает строку с ввода. Опция -p показывает подсказку:

read -p "Open which file? " user_file

echo $user_file

Если не указать имя переменной, ввод сохранится в REPLY:

read -p "Open which file? "

echo $REPLY

Удобно использовать осмысленные имена переменных для читабельности скриптов.

Манипуляции со строками

Ниже — ключевые приёмы работы со строками, доступные в POSIX/Bash‑совместимых оболочках (учтите различия версий Bash в разделе совместимости).

Получение длины строки

Предваряя имя переменной символом #, вы получаете длину значения в байтах (для ASCII это совпадает с количеством символов):

my_string="There are 39 characters in this string."
echo ${#my_string}

Важно: в окружениях с многобайтовыми символами (UTF‑8) ${#var} возвращает количество символов, а не байтов, если локаль корректно настроена.

Извлечение подстроки по смещениям

Синтаксис ${var:start:length} извлекает подстроку, где start — нулевой индекс начала, length — необязательная длина. Если length не задан — берётся до конца строки.

long_string="Frankenstein or the Modern Prometheus"
substring=${long_string:0:12}
echo $substring    # "Frankenstein"

echo ${long_string:27} # вывод с позиции 27 до конца

Также допустимы отрицательные значения для длины, чтобы отбросить несколько символов с конца:

my_string="alphabetical"
echo ${my_string:5:-4}

Оригинальная переменная остаётся без изменений.

Извлечение по разделителю (удаление части)

Если строки разделены знаком (например, пробелом или точкой), то можно использовать конструкции с % и # для удаления частей:

  • ${var%%pattern} — удаляет длинную совпадающую часть с конца (жадно) при поиске с передней стороны;
  • ${var%pattern} — удаляет короткую совпадающую часть с конца;
  • ${var##pattern} — удаляет длинную совпадающую часть с начала при поиске с задней стороны;
  • ${var#pattern} — удаляет короткую совпадающую часть с начала.

Примеры:

long_string="first second third fourth fifth"
echo ${long_string%%' '*}  # вернёт "first"
echo ${long_string%' '*}   # вернёт "first second third fourth"

Поиск с конца строки (например, получить расширение файла):

long_string="this.long.string.of.words.is.delimited.by.periods"
echo ${long_string##*.}  # вернёт последнее поле после последней точки

Короткая форма с # убирает минимальную часть слева:

echo ${long_string#*.}  # удаляет до первой точки, вернёт всё после неё

Иллюстрация извлечения подстроки с начала строки

Замена подстрок

Синтаксис ${var/pattern/replacement} заменяет первое совпадение; ${var//pattern/replacement} — все совпадения. Можно ограничить замену началом (#) или концом (%) строки.

string="blue pig giggles"
echo ${string/pig/goat}  # "blue goat giggles"

echo ${string//g/gX}      # заменит все 'g' на 'gX'

Ограничение на конец строки:

string="blue pig giggles"
echo ${string/%giggles/chuckles}  # заменит, если строка заканчивается на 'giggles'

Ограничение на начало строки:

string="blue pig giggles"
echo ${string/#blue/yellow}  # заменит только в начале

Когда встроенных средств недостаточно

Bash удобен для простых правок, но у внешних утилит есть преимущества:

  • awk — мощная обработка полей, вычисления, более сложные шаблоны;
  • sed — потоковый редактор для замен и преобразований в потоке;
  • grep — быстрый поиск по регулярным выражениям;
  • cut/tr — простые разбиения и преобразования.

Используйте их, если задача выходит за рамки простых подстановок или если объём данных большой.

Практические советы и частые ошибки

  • Всегда проверяйте локаль (переменная окружения LANG или LC_CTYPE) при работе с UTF‑8. Без корректной локали подсчёт символов и операции с подстроками могут вести себя неожиданно.
  • При обработке путей и имён файлов избегайте наивных парсингов точкой; лучше применять явное разделение или использовать basename/dirname.
  • Не полагайтесь на изменение переменных окружения в подпроцессах: подпроцессы не меняют переменную в родительской оболочке.
  • Для безопасности при вставке пользовательского ввода в команды используйте кавычки и избегайте неочищенных подстановок.

Чек‑лист перед публикацией скрипта

  • Все переменные имеют осмысленные имена.
  • Используются кавычки для значений, содержащих пробелы.
  • Проверена совместимость с минимальной версией Bash, требуемой проектом.
  • Есть обработка ошибок ввода (пустые строки, неверные пути).
  • В комментариях указана целевая локаль/формат (если важен подсчёт символов).

Роли и задачи: что важно знать

  • Для разработчика: писать читаемые функции, не полагаться на глобальные переменные.
  • Для сисадмина: проверять производительность при обработке больших логов, выбирать awk/sed при необходимости.
  • Для тестировщика: создавать кейсы с ASCII и UTF‑8, длинными строками, пустыми значениями и специальными символами.

Набор тестов (примеры приёмки)

  • Короткая строка: проверка вывода для ${#var} и ${var:0:3}.
  • Пустая строка: операции не должны ломаться, программы должны выдавать корректные пустые значения.
  • Строка с пробелами в начале/конце: убедиться, что конкатенация и подстановка учитывает пробелы.
  • UTF‑8: строка с кириллицей/эмодзи — корректный подсчёт символов и извлечение.
  • Замена в начале/конце: ${var/#pattern/replace} и ${var/%pattern/replace} работают только при совпадении в соответствующей позиции.

Ментальные модели и приёмы выбора инструмента

  • Если операция — локальная (одна строка, простая подстановка/извлечение) — используйте Bash.
  • Если операция — потоковая над большими объёмами данных или сложные регэкспы — выбирайте sed/awk.
  • Если нужна максимальная переносимость и минимальные зависимости — держитесь встроенных средств Bash.

Совместимость и версия Bash

Некоторые синтаксические возможности варьируются между оболочками (sh, dash, zsh, bash). Например, расширенные параметрические подстановки хорошо поддерживаются в Bash 3+; но если вы ориентируетесь на /bin/sh, проверьте поддерживаемость конкретных конструкций. В современных дистрибутивах Bash 4 и 5 добавили дополнительные возможности (например, ассоциативные массивы) — если вы используете их, явно указывайте требуемую версию в шебанге #!/usr/bin/env bash.

Важно: поведение с локалью и многобайтовыми символами зависит от настроек окружения (LANG, LC_ALL).

Альтернативные подходы (коротко)

  • Для разбора CSV используйте специализированные утилиты (csvkit) или awk с правильной обработкой кавычек.
  • Для массовых замен в файлах используйте sed -i с резервной опцией при необходимости.
  • Для сложных манипуляций строк в скриптах большого проекта рассмотрите написание утилиты на Python/Perl, где парсинг и манипуляции с Unicode проще встроены.

Примеры «когда встроенные приёмы не подойдут» (контрпримеры)

  • Надёжный разбор сложного CSV с вложенными кавычками и переносами строк — встроенные подстановки не хватят.
  • Поиск и замена с использованием сложных регулярных выражений и групп захвата — лучше sed/awk/Perl.
  • Потоковая обработка сотен мегабайт логов — внешний инструмент будет предпочтительнее по производительности.

Шаблон‑шпаргалка (cheat sheet)

  • Длина: ${#var}
  • Подстрока: ${var:start:length}
  • Удалить с начала (до первого совпадения): ${var#pattern}
  • Удалить с начала (до последнего): ${var##pattern}
  • Удалить с конца (до первого с конца): ${var%pattern}
  • Удалить с конца (до последнего с конца): ${var%%pattern}
  • Заменить первое: ${var/pat/repl}
  • Заменить все: ${var//pat/repl}
  • Ограничить замену началом: ${var/#pat/repl}
  • Ограничить замену концом: ${var/%pat/repl}

Краткое резюме

Используйте встроенные возможности Bash для простых, локальных преобразований строк — они быстрые, портируемые и не требуют сторонних зависимостей. Для сложных задач применяйте awk, sed или языки высокого уровня. Проверяйте локаль при работе с Unicode и добавляйте тесты на краевые случаи.

Важно: всегда оборачивайте пользовательский ввод в кавычки и явно документируйте требуемую версию оболочки.

Примечание: эта статья даёт практический обзор и рабочие примеры. Для глубокой оптимизации и парсинга больших объёмов текстов обратитесь к специализированным инструментам.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Экономия батареи в Opera: включение и управление
Браузеры

Экономия батареи в Opera: включение и управление

Как отписаться от рассылок в Gmail
Электронная почта

Как отписаться от рассылок в Gmail

Скрипты и плагины GIMP: установка и практики
Графика

Скрипты и плагины GIMP: установка и практики

RoundedTB — закруглить панель задач Windows 11
Windows

RoundedTB — закруглить панель задач Windows 11

Персонализированный Flash Briefing на Amazon Echo
Инструкции

Персонализированный Flash Briefing на Amazon Echo

Множественные удалённые подключения в Windows Vista
Windows

Множественные удалённые подключения в Windows Vista