Spec-Zone.ru › Bash

Подстановка параметров оболочки

​ ​

Символ ‘$’ вводит подстановку параметров, подстановку команд или арифметическую подстановку. Имя параметра или символ, подлежащий подстановке, можно заключить в фигурные скобки. Они необязательны, но позволяют защитить подставляемую переменную от непосредственно следующих за ней символов, которые могут быть интерпретированы как часть имени. Например, если значение первого позиционного параметра равно ‘a’, то ${11} подставляет значение одиннадцатого позиционного параметра, а $11 подставляет ‘a1’.

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

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

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

Во всех приведённых ниже случаях word подвергается тильда-подстановке, подстановке параметров, подстановке команд и арифметической подстановке.

Если не выполняется подстановка подстроки, при использовании описанных ниже форм (например, ‘:-’) Bash проверяет, не установлен ли параметр или не является ли он пустым. Если опустить двоеточие, проверяется только, установлен ли параметр. Иными словами, если двоеточие указано, оператор проверяет и наличие parameter, и то, что его значение не пустое; если двоеточие опущено, оператор проверяет только наличие параметра.

${parameter:−word}

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

$ v=123
$ echo ${v-unset}
123
$ echo ${v:-unset-or-null}
123
$ unset v
$ echo ${v-unset}
unset
$ v=
$ echo ${v-unset}

$ echo ${v:-unset-or-null}
unset-or-null
${parameter:=word}

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

$ unset var
$ : ${var=DEFAULT}
$ echo $var
DEFAULT
$ var=
$ : ${var=DEFAULT}
$ echo $var

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

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

$ var=
$ : ${var:?var is unset or null}
bash: var: var is unset or null
$ echo ${var?var is unset}

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

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

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

$ echo ${var+var is set}
var is set
$ unset var
$ echo ${var+var is set}

$ echo ${var:+var is set and not null}

$ 
${parameter:offset}
${parameter:offset:length}

Это называется подстановкой подстроки. Она подставляет до length символов значения parameter, начиная с символа, заданного параметром offset. Если parameter равен ‘@’ или ‘*’, является индексированным массивом с индексом ‘@’ или ‘*’ либо именем ассоциативного массива, результат отличается, как описано ниже. Если :length опущен (первая форма выше), подставляется подстрока значения parameter, начиная с символа, заданного параметром offset, и до конца значения. Если offset опущен, он считается равным 0. Если length опущен, но двоеточие после offset присутствует, он считается равным 0. 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 соответствует последнему позиционному параметру (или 0, если позиционных параметров нет). Если 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 установлена, и пустое значение в противном случае. Если используется ‘@’ и подстановка находится внутри двойных кавычек, каждый ключ подставляется как отдельное слово.

${#parameter}

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

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

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

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

Результат подстановки word образует шаблон, который сопоставляется с подставленным значением parameter согласно описанным ниже правилам (см. Сопоставление с шаблоном). Если шаблон совпадает с завершающей частью подставленного значения 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 пуст, совпадения pattern удаляются, а следующую за pattern косую черту ‘/’ можно опустить.

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

Заключение любой части 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. Сначала pattern разворачивается в шаблон, как описано ниже в разделе Сопоставление с шаблоном.

Затем Bash проверяет символы подставленного значения parameter на соответствие pattern, как описано ниже. Регистр символа, совпавшего с шаблоном, изменяется. Шаблон не должен пытаться сопоставить более одного символа.

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

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

${parameter@operator}

В зависимости от значения operator, подстановка либо преобразует значение parameter, либо возвращает сведения о самом parameter. Каждый operator представляет собой одну букву:

U

Подставляется строка со значением parameter, в которой все строчные буквы преобразованы в прописные.

u

Подставляется строка со значением parameter, в которой первый символ преобразован в прописной, если это буква.

L

Подставляется строка со значением parameter, в которой все прописные буквы преобразованы в строчные.

Q

Подставляется строка со значением parameter, заключённым в кавычки в формате, который можно повторно использовать как ввод.

E

Подставляется строка со значением parameter, в которой раскрыты escape-последовательности с обратной косой чертой, как при использовании механизма заключения в кавычки $'…'.

P

Подставляется строка, полученная в результате обработки значения parameter как строки приглашения (см. Управление приглашением).

A

Подставляется строка в форме оператора присваивания или команды declare, которая при выполнении воссоздаёт parameter вместе с его атрибутами и значением.

K

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

a

Подставляется строка из значений флагов, представляющих атрибуты parameter.

k

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

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

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

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