Расширение фигурных скобок в Bash: практическое руководство

Быстрые ссылки
- Расширение фигурных скобок
- Простые расширения
- Использование с циклами
- Конкатенация и вложенность
- Преамбула и постскрипт
- Расширение имён файлов и директорий
- Советы, ошибки и шпаргалки
Введение: зачем использовать расширение фигурных скобок
Перед выполнением команды Bash проверяет, требуется ли выполнить подстановки. Имена переменных заменяются значениями, алиасы разворачиваются в команды, а расширения обрабатываются. Расширение фигурных скобок — один из видов таких подстановок. Оно встроено в современные оболочки (например, Bash), но может отсутствовать в старых реализациях. Если используете его в скриптах, явно запускайте совместимую оболочку:
#!/bin/bashМы будем использовать Bash в примерах. Расширение полезно, когда нужно сгенерировать набор строк без многократного ручного ввода. Оно экономит время и уменьшает опечатки.
Расширение фигурных скобок — суть
Расширение пишется в фигурных скобках {}. Внутри либо список элементов через запятую, либо диапазон, задаваемый точками. Пробелы внутри скобок запрещены, если не брать часть в кавычки.
Простой список: каждый элемент подставляется по очереди в вызываемую команду. Комма в результат не попадает.
echo {one,two,three,four}Либо числа:
echo {1,2,3,4}Порядок элементов произвольный — расширение просто перечисляет их.
echo {4,2,3,1}
Диапазоны задаются началом и концом, разделёнными двумя точками ... Bash автоматически подставит все значения между ними.
echo {1..10}Нумерация не обязана начинаться с 1:
echo {3..12}Диапазоны можно задавать в обратном порядке:
echo {5..1}Поддерживаются отрицательные числа:
echo {4..-4}Диапазон может быть и буквенным:
echo {q..v}И буквы в обратном порядке:
echo {f..a}Использование расширения с циклами
Размерные и буквенные диапазоны удобно использовать в циклах for.
for i in {3..7}
do
echo $i
doneИли буквы:
for i in {m..q}
do
echo $i
doneВ интерактивной сессии можно записать в одну строку:
for i in {3..7}; do echo $i; done
for i in {m..q}; do echo $i; done
Циклы с расширением удобно читать и поддерживать. Если вы генерируете имена задач или шаги сборки, это часто лучше, чем вручную прописывать множество элементов.
Конкатенация и вложенность
Две соседние конструкции расширения не выполняются полностью независимо. Каждая комбинация из первой и второй подставляется по очереди.
echo {q..v}{1..3}Вложенные расширения действуют на ближайший предшествующий элемент:
echo {part-1,part-2{a,b,c,d},part-3}Можно вложить несколько диапазонов через запятую:
echo {{5..0},{1..5}}Nesting позволяет аккуратно генерировать комбинации без внешних циклов.
Преамбула и постскрипт
Вы можете добавить текст до или после расширения — он попадёт в каждую сгенерированную строку. Текст перед расширением — прeамбула, после — постскрипт.
echo chapter{1..3}echo {contents,paper,bilbiography}.mdecho chapter-{1..4}.mdРасширение имён файлов и директорий
Одно из главных применений — быстрое создание файлов и директорий.
Создадим файлы:
touch file-{1..4}.txtПроверим:
ls *.txtЕсли у вас есть много файлов с общим базовым именем, но разными расширениями, можно выполнить операцию только над выбранными типами:
zip source-code program{.c,.h,.css}Интересный приём — добавить пустой первый элемент в списке, чтобы получить оригинальное имя и копию с суффиксом:
cp brace/new/prog-1.c{,.bak}Результат — файл prog-1.c.bak.
Для сравнения файлов в двух поддиректориях удобно поместить имя каталога в расширение:
diff brace/{new,old}/prog-1.cЕсли нужно создать стандартную структуру каталогов проекта, используйте mkdir -p и вложенные расширения:
mkdir -p {source,build,man,help{/pages,/yelp,/images}}tree
Можно комбинировать расширение с загрузками:
wget https://www.URL-of-your-choice.com/test{1,2}/picture{001,002}.jpgИ посмотреть скачанные файлы:
ls picture*.*Когда расширение не сработает (ошибки и ограничения)
- Если оболочка не поддерживает расширение фигурных скобок (напр., sh без Bash), конструкции останутся нетронутыми или вызов удалит синтаксис. Решение: запускать скрипт через Bash (
#!/bin/bash) или использовать совместимую оболочку. - Пробелы внутри скобок без кавычек ломают расширение. Внутри скобок допускаются только элементы, разделённые запятыми.
- Если первый элемент списка в расширении пуст (например
{,.bak}), это намеренное поведение: пустой элемент подставляет исходное значение. Убедитесь, что это то, что вы хотите. - Расширение выполняется ДО подстановки переменных и путей. Если вы ожидаете, что переменные развернутся внутри скобок, порядок может отличаться — сначала расширение, затем остальные подстановки.
- Globbing (маски с * и ?) и расширение скобок — разные механизмы. Globbing оперирует существующими файлами; расширение — создание наборов строк. Не полагайтесь на то, что они будут взаимодействовать предсказуемо.
Важно: всегда сначала протестируйте команды с echo или printf перед выполнением операций записи (rm, mv, cp, zip), чтобы увидеть сгенерированные имена.
Альтернативные подходы
- Циклы и массивы в Bash. Если логика сложная или список динамически вычисляется, удобнее использовать массивы и циклы.
- seq и printf для числовых последовательностей:
for i in $(seq 1 10); do echo $i; doneили
printf "%s\n" {1..10}- Комбинация find + xargs для работы с файлами по критерию. Расширение скобок лучше подходит для предсказуемых синтаксических шаблонов.
Хитрости, эвристики и лучшие практики
- Тестируйте с echo: сначала выполните
echoс выражением, потом — реальную операцию. - Используйте фигурные скобки для повторяющихся префиксов/суффиксов:
cp src/{a,b,c}.txt dest/. - Для нумерации с ведущими нулями используйте printf или pad-формат:
{001..100}поддерживается в Bash 4+, но в старых версиях лучше генерация через printf. - Не полагайтесь на порядок перечисления, если он не определён в исходном списке; при диапазонах порядок детерминирован.
- Комбинируйте с опцией
-pу mkdir для безопасного создания вложенных директорий.
Чек-лист для задач (роли)
Разработчик:
- Протестировал расширение через echo
- Убедился, что оболочка — Bash
- Проверил побочные эффекты на существующих файлах
Системный администратор:
- Использовал абсолютные пути для cron-скриптов
- Проверил поведение при отсутствии прав на запись
DevOps/CI:
- Включил скрипт в Dockerfile с указанием SHELL/ENTRYPOINT
- Добавил тест на создание директорий в pipeline
Готовые шаблоны и примеры (шпаргалка)
Быстро создать резервные копии нескольких расширений:
cp project{.py,.sh,.md} backup/Создать файлы отчётов за кварталы:
touch report-Q{1..4}-{2023..2025}.pdfСкачать несколько изображений сразу:
wget https://example.com/images/img{01..10}.pngСоздать структуру проекта с README и шаблонами:
mkdir -p project/{src,tests,docs{,/images,/api}}Генерация комбинаций имён и версий:
echo app-{alpha,beta,rc}{-x86,-arm}Микро-методология: как внедрить расширение в ваш рабочий процесс
- Идентифицируйте повторяющиеся шаблоны имён файлов или директорий.
- Замените ручной ввод на расширение фигурных скобок.
- Протестируйте
echo/printfвывод. - Запустите операции создания/копирования в изолированной директории.
- Включите в документацию проекта советы по запуску (#!/bin/bash).
Модель мышления (mental model)
Думайте о расширении как о простом генераторе картезианского произведения для соседних скобок и как о фабрике имен для команд. Оно не зависит от существования файлов — оно просто генерирует строки.
Когда лучше не использовать расширение (контрпримеры)
- Если список формируется динамически из результатов команды (например, output find), используйте массивы или конвейеры, а не статическое расширение.
- Если важно учитывать только существующие файлы, используйте globbing (
*.c) илиfind.
Совместимость и миграция
- Bash 4+ поддерживает многие удобные расширения (например, нумерация с ведущими нулями). На старых системах (старые BusyBox/ash) поведение может отличаться.
- Для скриптов, которые должны работать в разных окружениях, явно указывайте интерпретатор (
#!/usr/bin/env bash). - В Docker-образах добавляйте bash, если требуется портативность.
Безопасность и приватность
- Никогда не используйте расширение скобок в командах удаления без предварительного просмотра.
- В скриптах, работающих с пользовательскими вводами, экранируйте или валидируйте значения, чтобы избежать непреднамеренного расширения пути.
Шпаргалка команд
- Просмотреть генерацию без выполнения:
echo patternилиprintf "%s\n" pattern - Создать файлы:
touch file-{1..10}.txt - Создать каталоги:
mkdir -p dir{A..C}/sub{1..2} - Скопировать с копией:
cp file{,.bak}
Тест-кейсы и критерии приёмки
- Для набора
{1..5}ожидается ровно пять элементов (1..5). - Для
{a..c}{1..2}ожидается 6 комбинаций: a1,a2,b1,b2,c1,c2. - Для вложенных
{part-{a,b},x}ожидается: part-a, part-b, x.
Краткий словарь (1-строчно)
- Расширение фигурных скобок: механизм генерации набора строк в оболочке.
- Преамбула: текст до расширения.
- Постскрипт: текст после расширения.
- Globbing: подстановка имён файлов по маске (*, ?).
Заключение
Расширение фигурных скобок — простой, но мощный инструмент для автоматизации создания имён, каталогов и комбинаций в Bash. Используйте echo для проверки, комбинируйте с циклами и командами вроде touch, mkdir, zip и wget, и вы заметно упростите рутинные операции.
Краткое резюме:
- Тестируйте команды через echo перед реальным выполнением.
- Указывайте совместимую оболочку (
#!/bin/bash) в скриптах. - Комбинируйте вложения скобок для сложных наборов.
Важно: попробуйте в своей среде: часто одна небольшая замена ручного ввода на расширение экономит минуты работы и снижает количество опечаток.
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента