Разбиение на слова, Подстановка имен файлов, Соответствия шаблонов и Удаление кавычек в bash

Разбиение на слова

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

Shell рассматривает каждый символ IFS как разделитель и разбивает результаты иных расщирений на слова из этих символов. Если IFS не установлена или её значение равно по умолчанию, то последовательности , и в начале и конце результатов предыдущего расширения игнорируются, а любая последовательность символов IFS которая находится не в начале или конце, служит для разделения на слова. Если IFS имеет значение отличное от значения по умолчанию, то последовательности символов пробелов и табуляции игнорируются в начале и конце слова, до символа пробела в значении IFS. Любой символ в IFS который не является IFS пробелом, вместе с любыми соседними IFS пробельными символами, ограничиваются полями. Последовательность пробельных символов IFS также рассматривается в качестве разделителей. Если значение IFS является пустым, разделение на слова не происходит.

Явные пустые аргумендты («» или ») сохраняются. Неназванные пустые аргументы, вследствие расширения параметров, которые не имеют никакого значения, удаляются. Если параметр без значения расширяется в двойных кавычках, нулевой результат является аргументом и сохраняется.

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

Подстановка имен файлов

После разбиения на слова, если опция -f не установлена, bash считывает каждое слово символов «*», «?», и «[». Если появляется один из этих символов, то слово рассматривается как шаблон и заменяется в алфавитном порядке списком имен файлов, соответствующих шаблону. Если совпадений имен файлов не найдено, и в shell не включена опция nullglob, то слово остаётся неизменным. Если опция nullglob установлена, и совпадений не найдено, слово удаляется. Если установлена опция failglob, и никаких совпадений не найдено, выводится сообщение об ошибке, и команда не выполняется. Если включена опция nocaseglob, совпадение проводится без учета регистра алфавитных символов. Следует отметить что здесь используется диапазон [a-z], любые же иные буквы могут быть включены в зависимости от настройки LC_COLLATE. Когда используется шаблон для расширения имен файлов, символ «.» в начале имени или сразу после косой черты, должны полностью совпадать, если опция shell не установлена. При сопоставлении путей имен файлов, косая черта всегда должна сопоставляться явно. В иных случаях символ «.» специально не рассматривается. Описание команд nocaseglob, nullglob, failglob и dotglob для shell я буду писать в будущем.

Переменная shell GLOBIGNORE может быть использована для ограничения множества имен файлов соответствующих шаблону. Если GLOBIGNORE установлена, каждое совпадение имени файла, которое совпадает с одним из шаблонов в GLOBIGNORE, удаляется из списка совпадений. Имена файлов «.» и «..» всегда игнорируется когда GLOBIGNORE установлена и не пуста. Однако настройка GLOBIGNORE в непустое значение имеет эффект при включении shell опции dotglob, так что все иные имена файлов которые начинаются с «.» будут совпадать. Чтобы вернуть старое поведение вне зависимости от имен файлов, начинающиеся с «.» сделайте «.*» один из шаблонов в GLOBIGNORE. Опция dotglob недоступна в том случае если GLOBIGNORE не установлен.

Соответствия шаблонов

Любой символ который применяется в шаблоне, кроме специальных символов шаблона, которые я опишу ниже соответствуют самому себе. В шаблоне не может возникнуть нулевой символ. Обратная косая черта маскирует следующий символ, маскировка обратной косой чертой отбрасывается при сопоставлении. Специальные символы шаблона должны быть заключены в кавычки, если они должны сопоставляться в буквальном смысле.

Специальные символы шаблона имеют следующие значения:

* Соответствует любой строке, включая пустую строку. Когда shell опция globstar включена и «*» используется в контексте расширения имен файлов, два соседних «*s», используется как единый шаблон который будет соответствовать всем файлам и нулю или большинству каталогов и подкаталогов. Если после «/» два соседних «*s» соответствуют только каталогам и подкаталогам.

? Соответствует любому одному символу.

[…] Соответствует любому из символов в скобках. Пара символов разделенные дефисом, обозначает выражение диапазона, который находится между этими двумя символами, включительно, использующие текущую локализацию и кодировку. Если первый символ следующий за «[» является «!» или «^» то любые символы не согласовываются. Порядок сортировки символов в диапазоне выражений определяется с учетом текущей локализации и значения shell переменной LC_COLLATE если установлено. «» можно согласовать включая из в качестве первого или последнего установленного символа. «]» могут быть согласованны путем включения его в качестве первого установленного символа.

В пределах [и] символы классов могут быть заданы с помощью конструкции [:класс:], где класс является одним из классов определенных в стандартной POSIX:

alnum alpha ascii blank cntrl digit graph lower print punct space upper word xdigit

Символы класса соответствуют любому символу, принадлежащему к этому классу. Символ класса word соответствует буквам, цифрам и символу «_».

В пределах [и] эквивалент класса может быть задан с помощью конструкции [=c=], которая соответствует всем символам в соответствии с текущей локалью как символ «c».

В пределах [и] синтаксис [.symbol.] соответствует упорядоченному symbol symbol.

Если shell опция extglob включается в помощью встроенной shopt, несколько расширенных шаблоном оператором признаются. В следующем описании, шаблон это список из одного или нескольких шаблонов разделенных «|». Композитные шаблоны могут быть получены с использованием одного или более из следующих подшаблонов:

?(шаблон-список)

Соответствует нулю или одному вхождению указанных шаблонов.

*(шаблон-список)

Соответствует нулю или большему количеству вхождений указанных шаблонов.

+(шаблон-список)

Соответствует одному или более вхождений указанных шаблонов.

@(шаблон-список)

Соответствует одному из указанных шаблонов.

!(шаблон-список)

Нет совпадений, кроме одного из указанных шаблонов.

Удаление кавычек

После предыдущих расширений, все кавычки с вхождением символов «\», «» и ««», которые не являются результатом одного из вышеуказанных расширений удаляются.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *