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