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

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

• 7 min read • Linux • Обновлено 24 Nov 2025
Расширение фигурных скобок в Bash
Расширение фигурных скобок в Bash

Обложка: терминал Linux с примерами команд

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

  • Расширение фигурных скобок
  • Простые расширения
  • Использование с циклами
  • Конкатенация и вложенность
  • Преамбула и постскрипт
  • Расширение имён файлов и директорий
  • Советы, ошибки и шпаргалки

Введение: зачем использовать расширение фигурных скобок

Перед выполнением команды Bash проверяет, требуется ли выполнить подстановки. Имена переменных заменяются значениями, алиасы разворачиваются в команды, а расширения обрабатываются. Расширение фигурных скобок — один из видов таких подстановок. Оно встроено в современные оболочки (например, Bash), но может отсутствовать в старых реализациях. Если используете его в скриптах, явно запускайте совместимую оболочку:

#!/bin/bash

Мы будем использовать Bash в примерах. Расширение полезно, когда нужно сгенерировать набор строк без многократного ручного ввода. Оно экономит время и уменьшает опечатки.

Расширение фигурных скобок — суть

Расширение пишется в фигурных скобках {}. Внутри либо список элементов через запятую, либо диапазон, задаваемый точками. Пробелы внутри скобок запрещены, если не брать часть в кавычки.

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

echo {one,two,three,four}

Либо числа:

echo {1,2,3,4}

Порядок элементов произвольный — расширение просто перечисляет их.

echo {4,2,3,1}

Вывод echo {one,two,three,four} в окне терминала

Диапазоны задаются началом и концом, разделёнными двумя точками ... 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 {3..7}; do echo $i; done в окне терминала

for i in {m..q}; 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}.md
echo 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

mkdir -p {source,build,man,help{/pages,/yelp,/images}} в окне терминала

Можно комбинировать расширение с загрузками:

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}

Микро-методология: как внедрить расширение в ваш рабочий процесс

  1. Идентифицируйте повторяющиеся шаблоны имён файлов или директорий.
  2. Замените ручной ввод на расширение фигурных скобок.
  3. Протестируйте echo/printf вывод.
  4. Запустите операции создания/копирования в изолированной директории.
  5. Включите в документацию проекта советы по запуску (#!/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) в скриптах.
  • Комбинируйте вложения скобок для сложных наборов.

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

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

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

Несколько аккаунтов Skype: Multi Skype Launcher
Программное обеспечение

Несколько аккаунтов Skype: Multi Skype Launcher

Журнал для работы: повысить продуктивность
Productivity

Журнал для работы: повысить продуктивность

Персональные звуки уведомлений на Android
Android.

Персональные звуки уведомлений на Android

Скачивание шоу Hulu для офлайн‑просмотра
Стриминг

Скачивание шоу Hulu для офлайн‑просмотра

Microsoft Start: персонализированная новостная лента
Новости

Microsoft Start: персонализированная новостная лента

Как изменить имя в Epic Games быстро
Гайды

Как изменить имя в Epic Games быстро