Spec-Zone.ru › Bash

Массивы

​

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

Spec-Zone.ru

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