Поддержка раскрытия скобок в оболочке Bash уже давно основывается на аналогичном свойстве оболочки С shell. В отличие от символов подстановки имен файлов, раскрытие скобок имеет исключительно текстовый характер. В частности, слова, образующиеся при раскрытии скобок, совсем не обязательно должны совпадать с именами существующих файлов. Имеются следующие формы раскрытия скобок.
рrе{Х, У[, Z...] }post
Раскрывается до preXpost, preYpost и т.д.
pre{ start. . end[. . incr] }post
где start и end обозначают целые числа или одиночные буквы, a incr — целое число. Оболочка расширяет эту конструкцию до полного диапазона в пределах от start до end, увеличивая целое число incr
, если оно указывается.
Постфиксный и префиксный тексты в обеих формах необязательны. В числовом выражении пределы start
и end
вместе или по отдельности могут предваряться одним или более начальным нулем. А результаты раскрытия скобок дополняются нулями до максимальной ширины пределов start и end. Оболочка Bash игнорирует начальные нули в целом числе incr, всегда интерпретируя его как десятичное значение.
Раскрытие скобок может быть вложенным, а его результаты — не отсортированными. Раскрытие скобок выполняется прежде других видов раскрытия выражений, а открывающие и закрывающие фигурные скобки не должны заключаться в кавычки, чтобы оболочка Bash смогла распознать их. Подстановки команд при раскрытии скобок игнорируются оболочкой Bash. Чтобы избежать конфликта с подстановкой параметров, раскрытие скобок не должно начинаться с последовательности символов $ {
.
# раскрыть текстуально, без сортировки
$ echo hi{DDD,BBB,CCC,AAA}there
hiDDDthere hiBBBthere hiCCCthere hiAAAthere
# раскрыть и найти совпадение с именами
# файлов chi, ch2, appl, арр2
$ Is {ch,app}?
# раскрыть до mv info info.old
$ mv info{,.old}
# простая числовая подстановка
$ echo 1 to 10 is {1..10}
1 to 10 is 1 2 3 4 5 6 7 8 9 10
# числовая подстановка с приращением
$ echo 1 to 10 by 2 is {1..10..2}
1 to 10 by 2 is 1 3 5 7 9
# числовая подстановка с дополнением нулями
$ echo 1 to 10 with zeros is (01..10}
1 to 10 with zeros is 01 02 03 04 05 06 07 08 09 10