Spec-Zone.ru › Bash

Расширение параметров оболочки

Символ ‘$’ запускает расширение параметров, подстановку команд или арифметическое расширение. Имя параметра или символ, подлежащий расширению, могут быть заключены в фигурные скобки, которые являются необязательными, но служат для защиты переменной от символов, которые могут быть интерпретированы как часть имени.

Если используются фигурные скобки, соответствующая закрывающая скобка — это первая ‘}’, не экранированная обратным слэшем или не находящаяся в строке с двойными кавычками, а также не вложенном арифметическом расширении, подстановке команды или расширении параметра.

Основной формой расширения параметра является ${параметр}. Подставляется значение параметра. Параметр — это параметр оболочки, как описано выше (см. Параметры оболочки), или ссылка на массив (см. Массивы). Фигурные скобки необходимы, когда параметр — это позиционный параметр с более чем одной цифрой или когда параметр следует за символом, который не должен интерпретироваться как часть его имени.

Если первый символ параметра — это восклицательный знак (!), и параметр не является ссылкой на имя, он вводит уровень косвенности. Bash использует значение, образованное расширением остальной части параметра, как новый параметр; затем этот параметр расширяется, и это значение используется в остальной части расширения, а не расширение исходного параметра. Это известно как indirect expansion. Значение подвергается расширению тильды, расширению параметра, подстановке команды и арифметическому расширению. Если параметр — это ссылка на имя, это расширяется до имени переменной, на которую ссылается параметр, вместо выполнения полного косвенного расширения. Исключение составляют расширения ${!префикс*} и ${!имя[@]}, описанные ниже. Восклицательный знак должен сразу следовать за левой фигурной скобкой, чтобы ввести косвенность.

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

Когда не выполняется расширение подстроки, используя форму, описанную ниже (например, ‘:-’), Bash проверяет параметр, который не задан или имеет значение null. Пропуск двоеточия приводит к проверке только на то, что параметр не задан. Другими словами, если двоеточие включено, оператор проверяет как существование параметра, так и то, что его значение не null; если двоеточие опущено, оператор проверяет только существование.

${parameter:-word}

Если параметр parameter не задан или равен null, подставляется расширение word. В противном случае подставляется значение parameter.

$ v=123
$ echo ${v-unset}
123
${parameter:=word}

Если parameter не задан или равен null, расширение word присваивается parameter. Затем подставляется значение parameter. Позиционные параметры и специальные параметры присваивать таким образом нельзя.

$ var=
$ : ${var:=DEFAULT}
$ echo $var
DEFAULT
${parameter:?word}

Если parameter равен null или не задан, расширение word (или сообщение об этом, если word отсутствует) записывается в стандартный поток ошибок и в оболочку, если она не интерактивна, завершается. В противном случае подставляется значение parameter.

$ var=
$ : ${var:?var is unset or null}
bash: var: var is unset or null
${parameter:+word}

Если parameter равен null или не задан, ничего не подставляется; в противном случае подставляется расширение word.

$ var=123
$ echo ${var:+var is set and not null}
var is set and not null
${parameter:offset}
${parameter:offset:length}

Это называется Подстрочным расширением. Оно расширяется до length символов значения parameter, начиная с символа, указанного offset. Если parameter равен ‘@’ или ‘*’, индексированному массиву с индексом ‘@’ или ‘*’, или имени ассоциативного массива, результаты отличаются, как описано ниже. Если length опущено, оно расширяется до подстроки значения parameter, начиная с символа, указанного offset, и до конца значения. length и offset являются арифметическими выражениями (см. Арифметику оболочки).

Если offset вычисляется как число меньше нуля, оно используется как смещение в символах с конца значения parameter. Если length вычисляется как число меньше нуля, оно интерпретируется как смещение в символах с конца значения parameter вместо количества символов, и расширение — это символы между offset и результатом. Обратите внимание, что отрицательное смещение должно быть разделено двоеточием по крайней мере одним пробелом, чтобы избежать путаницы с расширением ‘:-’.

Ниже приведены примеры, иллюстрирующие подстрочное расширение параметров и индексированных массивов:

$ string=01234567890abcdefgh
$ echo ${string:7}
7890abcdefgh
$ echo ${string:7:0}

$ echo ${string:7:2}
78
$ echo ${string:7:-2}
7890abcdef
$ echo ${string: -7}
bcdefgh
$ echo ${string: -7:0}

$ echo ${string: -7:2}
bc
$ echo ${string: -7:-2}
bcdef
$ set -- 01234567890abcdefgh
$ echo ${1:7}
7890abcdefgh
$ echo ${1:7:0}

$ echo ${1:7:2}
78
$ echo ${1:7:-2}
7890abcdef
$ echo ${1: -7}
bcdefgh
$ echo ${1: -7:0}

$ echo ${1: -7:2}
bc
$ echo ${1: -7:-2}
bcdef
$ array[0]=01234567890abcdefgh
$ echo ${array[0]:7}
7890abcdefgh
$ echo ${array[0]:7:0}

$ echo ${array[0]:7:2}
78
$ echo ${array[0]:7:-2}
7890abcdef
$ echo ${array[0]: -7}
bcdefgh
$ echo ${array[0]: -7:0}

$ echo ${array[0]: -7:2}
bc
$ echo ${array[0]: -7:-2}
bcdef

Если parameter равен ‘@’ или ‘*’, результатом являются length позиционных параметров, начиная с offset. Отрицательное offset вычисляется относительно числа, на единицу больше максимального позиционного параметра, так что смещение -1 соответствует последнему позиционному параметру. Ошибка расширения возникает, если length вычисляется как число меньше нуля.

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

$ set -- 1 2 3 4 5 6 7 8 9 0 a b c d e f g h
$ echo ${@:7}
7 8 9 0 a b c d e f g h
$ echo ${@:7:0}

$ echo ${@:7:2}
7 8
$ echo ${@:7:-2}
bash: -2: substring expression < 0
$ echo ${@: -7:2}
b c
$ echo ${@:0}
./bash 1 2 3 4 5 6 7 8 9 0 a b c d e f g h
$ echo ${@:0:2}
./bash 1
$ echo ${@: -7:0}

Если parameter — это имя индексированного массива, индексированного ‘@’ или ‘*’, результатом являются length элементов массива, начиная с ${parameter[offset]}. Отрицательное offset вычисляется относительно числа, на единицу больше максимального индекса указанного массива. Ошибка расширения возникает, если length вычисляется как число меньше нуля.

Эти примеры показывают, как использовать подстрочное расширение с индексированными массивами:

$ array=(0 1 2 3 4 5 6 7 8 9 0 a b c d e f g h)
$ echo ${array[@]:7}
7 8 9 0 a b c d e f g h
$ echo ${array[@]:7:2}
7 8
$ echo ${array[@]: -7:2}
b c
$ echo ${array[@]: -7:-2}
bash: -2: substring expression < 0
$ echo ${array[@]:0}
0 1 2 3 4 5 6 7 8 9 0 a b c d e f g h
$ echo ${array[@]:0:2}
0 1
$ echo ${array[@]: -7:0}

Подстрочное расширение, примененное к ассоциативному массиву, даёт неопределённые результаты.

Индексирование подстрок основано на нулевом индексе, если не используются позиционные параметры, в этом случае индексирование по умолчанию начинается с 1. Если offset равен 0, и используются позиционные параметры, $0 добавляется в начало списка.

${!prefix*}
${!prefix@}

Расширяется до имён переменных, имена которых начинаются с prefix, разделённых первым символом IFS специальной переменной. При использовании ‘@’ и расширении в двойных кавычках каждое имя переменной расширяется до отдельного слова.

${!name[@]}
${!name[*]}

Если name — переменная массива, расширяется до списка индексов массива (ключей), назначенных в name. Если name не массив, расширяется до 0, если name установлена, и null в противном случае. При использовании ‘@’ и расширении в двойных кавычках каждый ключ расширяется до отдельного слова.

${#parameter}

Заменяется длина в символах расширенного значения parameter. Если parameter равен ‘*’ или ‘@’, подставляется количество позиционных параметров. Если parameter — имя массива, индексированного ‘*’ или ‘@’, подставляется количество элементов в массиве. Если parameter — это имя индексированного массива, индексированного отрицательным числом, это число интерпретируется как смещение относительно числа, на единицу больше максимального индекса parameter, так что отрицательные индексы отсчитываются от конца массива, а индекс -1 ссылается на последний элемент.

${parameter#word}
${parameter##word}

word расширяется до шаблона, и сопоставляется в соответствии с правилами, описанными ниже (см. Сопоставление шаблонов). Если шаблон соответствует началу расширенного значения parameter, результат расширения — это расширенное значение parameter с удалённым кратчайшим совпадающим шаблоном (случай ‘#’) или самым длинным совпадающим шаблоном (случай ‘##’). Если parameter равен ‘@’ или ‘*’, операция удаления шаблона применяется к каждому позиционному параметру по очереди, и расширение — это результирующий список. Если parameter — это переменная массива, индексированная ‘@’ или ‘*’, операция удаления шаблона применяется к каждому элементу массива по очереди, и расширение — это результирующий список.

${parameter%word}
${parameter%%word}

word расширяется до шаблона, и сопоставляется в соответствии с правилами, описанными ниже (см. Сопоставление шаблонов). Если шаблон соответствует заключительной части расширенного значения parameter, результат расширения — значение parameter с удалённым кратчайшим совпадающим шаблоном (случай ‘%’) или самым длинным совпадающим шаблоном (случай ‘%%’). Если parameter равен ‘@’ или ‘*’, операция удаления шаблона применяется к каждому позиционному параметру по очереди, и расширение — это результирующий список. Если parameter — это переменная массива, индексированная ‘@’ или ‘*’, операция удаления шаблона применяется к каждому элементу массива по очереди, и расширение — это результирующий список.

${parameter/pattern/string}
${parameter//pattern/string}
${parameter/#pattern/string}
${parameter/%pattern/string}

Шаблон pattern расширяется до шаблона, как и при расширении имён файлов. Parameter расширяется, и самая длинная совпадающая подстрока pattern со своим значением заменяется string. string подвергается расширению тильды, расширению параметров и переменных, арифметическому расширению, подстановке команд и процессов и удалению кавычек. Сопоставление выполняется в соответствии с правилами, описанными ниже (см. Сопоставление шаблонов).

В первом варианте выше заменяется только первое совпадение. Если между parameter и pattern стоят две косые черты (второй вариант выше), все совпадения pattern заменяются на string. Если pattern предваряется ‘#’ (третий вариант выше), он должен совпадать с началом расширенного значения parameter. Если pattern предваряется ‘%’ (четвёртый вариант выше), он должен совпадать с концом расширенного значения parameter. Если расширение string null, совпадения pattern удаляются. Если string null, совпадения pattern удаляются, и ‘/’ после pattern можно опустить.

Если опция оболочки patsub_replacement включена с помощью shopt, все необработанные вхождения ‘&’ в string заменяются соответствующей частью pattern. Это призвано дублировать общий sed idiom.

Указывание любой части string в двойных кавычках препятствует замене в расширении цитируемой части, включая строковые замены, хранящиеся в переменных оболочки. Обратная косая черта экранирует ‘&’ в string; обратная косая черта удаляется, чтобы разрешить литеральную ‘&’ в строке замены. Пользователи должны быть осторожны, если string находится в двойных кавычках, чтобы избежать нежелательных взаимодействий между обратной косой чертой и двойными кавычками, поскольку обратная косая черта имеет специальное значение в двойных кавычках. Подстановка шаблона выполняет проверку на нецитируемые ‘&’ после расширения string, поэтому пользователи должны убедиться, что правильно цитируют все случаи ‘&’, которые они хотят воспринимать буквально в замене, и убедиться, что все случаи ‘&’, которые они хотят заменить, не цитируются.

Например,

var=abcdef
rep='& '
echo ${var/abc/& }
echo "${var/abc/& }"
echo ${var/abc/$rep}
echo "${var/abc/$rep}"

отобразит четыре строки "abc def", тогда как

var=abcdef
rep='& '
echo ${var/abc/\& }
echo "${var/abc/\& }"
echo ${var/abc/"& "}
echo ${var/abc/"$rep"}

отобразит четыре строки "& def". Как и операторы удаления шаблона, двойные кавычки вокруг строки замены цитируют расширенные символы, а двойные кавычки, окружающие всю подстановку параметра, не цитируют, так как расширение выполняется в контексте, который не учитывает двойные кавычки.

Поскольку обратная косая черта может экранировать ‘&’, она также может экранировать обратную косую черту в строке замены. Это означает, что ‘\\’ вставит буквально обратную косую черту в замену, поэтому эти два echo команд

var=abcdef
rep='\\&xyz'
echo ${var/abc/\\&xyz}
echo ${var/abc/$rep}

оба выведут ‘\abcxyzdef’.

Вряд ли потребуется заключать только string в двойные кавычки.

Если опция оболочки nocasematch (см. описание shopt в Встроенной команде Shopt) включена, сопоставление выполняется без учёта регистра букв. Если parameter равен ‘@’ или ‘*’, операция замены применяется к каждому позиционному параметру по очереди, и расширение — это результирующий список. Если parameter — это переменная массива, индексированная ‘@’ или ‘*’, операция замены применяется к каждому элементу массива по очереди, и расширение — это результирующий список.

${parameter^pattern}
${parameter^^pattern}
${parameter,pattern}
${parameter,,pattern}

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

Оператор ‘^’ преобразует строчные буквы, соответствующие шаблону, в заглавные; оператор ‘,’ преобразует соответствующие заглавные буквы в строчные. Расширения ‘^^’ и ‘,,’ преобразуют каждый соответствующий символ в расширенном значении; расширения ‘^’ и ‘,’ сопоставляют и преобразуют только первый символ в расширенном значении. Если шаблон опущен, он обрабатывается как ‘?’, что соответствует каждому символу.

Если параметр равен ‘@’ или ‘*’, операция изменения регистра применяется к каждому позиционному параметру по очереди, а расширение — это результирующий список. Если параметр является переменной массива с индексом ‘@’ или ‘*’, операция изменения регистра применяется к каждому элементу массива по очереди, а расширение — это результирующий список.

${parameter@operator}

Расширение — это либо преобразование значения параметра, либо информация о параметре самом по себе, в зависимости от значения оператора. Каждый оператор — это одиночная буква:

U

Расширение — это строка, представляющая значение параметра со строчными буквенными символами, преобразованными в заглавные.

u

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

L

Расширение — это строка, представляющая значение параметра с заглавными буквенными символами, преобразованными в строчные.

Q

Расширение — это строка, представляющая значение параметра, заключённое в кавычки в формате, который может быть повторно использован в качестве входных данных.

E

Расширение — это строка, представляющая значение параметра с расширенными последовательностями обратного слеша, как и в механизме цитирования $'…'.

P

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

A

Расширение — это строка в форме оператора присваивания или declare команды, которая, если будет вычислена, воссоздаст параметр со своими атрибутами и значением.

K

Создаёт, возможно, заключённую в кавычки версию значения параметра, за исключением того, что она выводит значения индексированных и ассоциативных массивов как последовательность пар «ключ-значение» в кавычках (см. Массивы).

a

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

k

Подобно преобразованию ‘K’, но расширяет ключи и значения индексированных и ассоциативных массивов в отдельные слова после разделения на слова.

Если параметр равен ‘@’ или ‘*’, операция применяется к каждому позиционному параметру по очереди, а расширение — это результирующий список. Если параметр является переменной массива с индексом ‘@’ или ‘*’, операция применяется к каждому элементу массива по очереди, а расширение — это результирующий список.

Результат расширения подвергается разделению на слова и расширению имён файлов, как описано ниже.

Copyright © 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc.
Licensed under the GNU Free Documentation License.
https://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Expansion.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API