Массивы
Bash предоставляет одномерные индексированные и ассоциативные переменные-массивы. Любую переменную можно использовать как индексированный массив; встроенная команда declare явно объявляет массив. Максимальный размер массива не ограничен, как и требование, чтобы элементы имели непрерывные индексы или назначались в непрерывном порядке. К элементам индексированных массивов обращаются с помощью арифметических выражений, которые должны вычисляться в целое число (см. Арифметические выражения оболочки)), индексация начинается с нуля; в ассоциативных массивах используются произвольные строки. Если не указано иное, индексы индексированных массивов должны быть неотрицательными целыми числами.
Оболочка выполняет подстановку параметров и переменных, арифметическую подстановку, подстановку команд и удаление кавычек в индексах индексированных массивов. Поскольку в результате могут получаться пустые строки, при индексировании они рассматриваются как выражения, значение которых равно 0.
Оболочка выполняет подстановку тильды, подстановку параметров и переменных, арифметическую подстановку, подстановку команд и удаление кавычек в индексах ассоциативных массивов. Пустые строки нельзя использовать в качестве ключей ассоциативных массивов.
Bash автоматически создает индексированный массив, если значение любой переменной присваивается с использованием синтаксиса
name[subscript]=value
Индекс рассматривается как арифметическое выражение, которое должно вычисляться в число, большее или равное нулю. Чтобы явно объявить индексированный массив, используйте
declare -a name
(см. Встроенные команды Bash). Также допускается синтаксис
declare -a name[subscript]
Индекс игнорируется.
Ассоциативные массивы создаются с помощью
declare -A name
Атрибуты переменной-массива можно задавать с помощью встроенных команд declare и readonly. Каждый атрибут применяется ко всем элементам массива.
Значения массивам присваиваются с помощью составных присваиваний вида
name=(value1 value2 ... )
где каждое value может иметь вид [subscript]=string. Для присваивания элементам индексированного массива требуется только string.
Каждое value в списке подвергается описанным выше подстановкам оболочки (см. Подстановки оболочки), но к элементам value, представляющим собой допустимые присваивания переменным, включая скобки и индекс, не применяются раскрытие фигурных скобок и разбиение на слова, как и в случае отдельных присваиваний переменным.
При присваивании индексированным массивам, если указан необязательный индекс, присваивание выполняется этому индексу; в противном случае элементу присваивается индекс, на единицу больший последнего индекса, которому было присвоено значение в этом операторе. Индексация начинается с нуля.
При присваивании ассоциативному массиву слова в составном присваивании могут быть либо операторами присваивания, для которых обязателен индекс, либо списком слов, интерпретируемым как последовательность чередующихся ключей и значений: name=(key1 value1 key2 value2 … ). Они обрабатываются так же, как name=( [key1]=value1 [key2]=value2 … ). Первое слово в списке определяет способ интерпретации остальных слов; все присваивания в списке должны быть одного типа. При использовании пар ключ/значение ключи не могут отсутствовать или быть пустыми; если отсутствует последнее значение, оно считается пустой строкой.
Этот синтаксис также поддерживается встроенной командой declare. Отдельным элементам массива можно присваивать значения с помощью описанного выше синтаксиса name[subscript]=value.
При присваивании индексированному массиву, если за name следует отрицательное число в качестве индекса, это число интерпретируется относительно значения, на единицу большего максимального индекса name; таким образом, отрицательные индексы отсчитываются от конца массива, а индекс -1 ссылается на последний элемент.
Оператор «+=» добавляет элементы к переменной-массиву при присваивании с использованием синтаксиса составного присваивания; см. раздел Параметры оболочки выше.
К элементу массива обращаются с помощью ${name[subscript]}. Фигурные скобки необходимы, чтобы избежать конфликтов с операторами раскрытия имен файлов в оболочке. Если индекс равен «@» или «*», слово раскрывается во все элементы массива name, если в описании встроенной команды или раскрытия слов не указано иное. Эти индексы различаются только тогда, когда слово находится в двойных кавычках. Если слово заключено в двойные кавычки, ${name[*]} раскрывается в одно слово, в котором значения элементов массива разделены первым символом переменной IFS, а ${name[@]} раскрывает каждый элемент name в отдельное слово. Если элементов массива нет, ${name[@]} раскрывается в пустую строку. Если раскрытие в двойных кавычках происходит внутри слова, раскрытие первого параметра объединяется с начальной частью исходного слова, а раскрытие последнего параметра — с конечной частью исходного слова. Это аналогично раскрытию специальных параметров «@» и «*».
${#name[subscript]} раскрывается в длину ${name[subscript]}. Если индекс равен «@» или «*», результатом раскрытия является количество элементов в массиве.
Если индекс, используемый для обращения к элементу индексированного массива, вычисляется в число меньше нуля, он интерпретируется относительно значения, на единицу большего максимального индекса массива; таким образом, отрицательные индексы отсчитываются от конца массива, а индекс -1 ссылается на последний элемент.
Обращение к переменной-массиву без индекса эквивалентно обращению с индексом 0. Допустимо любое обращение к переменной с использованием допустимого индекса; при необходимости Bash создает массив.
Переменная-массив считается установленной, если значение было присвоено какому-либо индексу. Пустая строка является допустимым значением.
Можно получить как ключи (индексы) массива, так и значения. ${!name[@]} и ${!name[*]} раскрываются в индексы, которым присвоены значения в переменной-массиве name. При использовании двойных кавычек они обрабатываются так же, как специальные параметры «@» и «*» в двойных кавычках.
Для уничтожения массивов используется встроенная команда unset. unset name[subscript] удаляет элемент массива с индексом subscript. Отрицательные индексы индексированных массивов интерпретируются, как описано выше. Удаление последнего элемента переменной-массива не приводит к удалению самой переменной. unset name удаляет весь массив, если name является массивом. unset name[subscript] ведет себя по-разному в зависимости от типа массива, если subscript равен «*» или «@». Если name — ассоциативный массив, удаляется элемент с ключом «*» или «@». Если name — индексированный массив, unset удаляет все элементы, но не сам массив.
При использовании имени переменной с индексом в качестве аргумента команды, например с unset, без синтаксиса раскрытия слов, описанного выше (например, unset a[4]), к аргументу применяется раскрытие имен файлов в оболочке. Если раскрытие имен путей нежелательно, заключите аргумент в кавычки (например, unset ’a[4]’).
Каждая из встроенных команд declare, local и readonly принимает параметр -a для указания индексированного массива и параметр -A для указания ассоциативного массива. Если указаны оба параметра, приоритет имеет -A. Встроенная команда read принимает параметр -a, чтобы присвоить массиву список слов, прочитанных из стандартного ввода; также она может считывать значения из стандартного ввода в отдельные элементы массива. Встроенные команды set и declare отображают значения массива так, чтобы их можно было повторно использовать в качестве ввода. Другие встроенные команды также принимают аргументы с именами массивов (например, mapfile); подробности см. в описаниях соответствующих встроенных команд. Оболочка предоставляет ряд встроенных переменных-массивов.
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/Arrays.html