Расширение параметров оболочки
Символ ‘$’ запускает расширение параметров, подстановку команд или арифметическое расширение. Имя параметра или символ, подлежащий расширению, могут быть заключены в фигурные скобки, которые являются необязательными, но служат для защиты переменной от символов, которые могут быть интерпретированы как часть имени.
Если используются фигурные скобки, соответствующая закрывающая скобка — это первая ‘}’, не экранированная обратным слэшем или не находящаяся в строке с двойными кавычками, а также не вложенном арифметическом расширении, подстановке команды или расширении параметра.
Основной формой расширения параметра является ${параметр}. Подставляется значение параметра. Параметр — это параметр оболочки, как описано выше (см. Параметры оболочки), или ссылка на массив (см. Массивы). Фигурные скобки необходимы, когда параметр — это позиционный параметр с более чем одной цифрой или когда параметр следует за символом, который не должен интерпретироваться как часть его имени.
Если первый символ параметра — это восклицательный знак (!), и параметр не является ссылкой на имя, он вводит уровень косвенности. 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. Это призвано дублировать общийsedidiom.Указывание любой части 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