Записки Вовика

Фигурные скобки в bash

Просмотров: 3025Комментарии: 0
Заметки*nix

В поисках некоторых ответов при написании скрипта в bash наткнулся на очень дельную статью Brace expansion на ресурсе Bash Hackers Wiki. Этот ресурс главной целью себе поставил создание читабельной документации и информации по башу чтобы не приходилось перечитывать в поисках ответов man по башу до последней буквы. Кто искал когда-нибудь ответ на вопрос по башу, тот в курсе как это непросто. Здесь же информация в статьях очень чётко структурирована, собрана по функциональным блокам и легко воспринимается. Так что немало информации оттуда перекочует ко мне.

Но вернемся к фигурным скобкам и механизму expansion в баше.

Что такое expansion в баше я опишу отдельной статьей, так как это важный для понимания процесс. Здесь же рассмотрим раскрытие фигурных скобок (brace expansion). Официальная документация весьма лаконична и для качественного восприятия требует вовсе не базовых навыков чтения на английском. Приведенная же статья очень легко читаема и понимаема. Добавлю еще ссылку на раздел 5.7 книги "Linux для пользователя", из которой я тоже почерпнул некоторые важные моменты для понимания темы.

{string1,string2,...,stringN}
{<START>..<END>}
{<START>..<END>..<INCR>} (Bash 4)
<PREAMBLE>{........}<POSTSCRIPT>

Итак, механизм раскрытия скобок позволяет создавать произвольные строки. Запись состоит из правила в фигурных скобках, приставки (Preamble) и окончания (Postscript). Результатом будет набор из всех возможных комбинаций, заданных правилом в скобках. Каждый из этих результатов будет иметь указанные приставку и окончание.

Наиболее частый пример использования это групповое формирование аргументов для команды согласно какой-либо схеме.

Раскрытие скобок выполняется до выполнения других видов подстановок в командной строке, причем все специальные символы, встречающиеся в командной строке, в том числе внутри скобок, сохраняются неизменными (они будут интерпретированы на следующих этапах анализа строки).

Раскрытие скобок выполняется до раскрытия переменных. Это крайне важно помнить. Если написать

echo {a,b}$PATH

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

echo a$PATH b$PATH

Также это означает, что диапазон вроде {1..200} нельзя записать при помощи переменных {$a..$b}. Как реализовать/обойти это описано в статье, но я опущу описание.

Brace expansion can be switched on and off under runtime by using the set builtin and the option -B and +B or the long option braceexpand . If brace expansion is enabled, the stringlist in SHELLOPTIONS contains braceexpand .

Фигурные скобки позволяют реализовать списки строк и диапазоны.

Списки строк.

{string1,string2,...,stringN}

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

$ echo {I,want,my,money,back}
I want my money back

При наличии приставки или окончания получаем следуещее:

$ echo _{I,want,my,money,back}
_I _want _my _money _back
$ echo {I,want,my,money,back}_
I_ want_ my_ money_ back_
$ echo _{I,want,my,money,back}-
_I- _want- _my- _money- _back-

The brace expansion is only performed, if the given string list is really a list of strings, i.e. if there's minimum one "," (comma)! Something like {money} doesn't expand to something special, it's really only the text "{money}".

Оставьте комментарий!

grin LOL cheese smile wink smirk rolleyes confused surprised big surprise tongue laugh tongue rolleye tongue wink raspberry blank stare long face ohh grrr gulp oh oh downer red face sick shut eye hmmm mad angry zipper kiss shock cool smile cool smirk cool grin cool hmm cool mad cool cheese vampire snake excaim question


Комментарий будет опубликован после проверки

     

  

(обязательно)