Массивы bash

Bash поддерживает одномерные индексированные и ассоциативные массивы переменных. Любая переменная может быть использована как индексированный массив, явно объявить массив можно при помощи встроенной команды «declare». Здесь нет ограничений на максимальный размер массива, единственное требование которое есть это то что элементы массива имеют индексы и значения индексов идет подряд. Индексированные массивы используют целые числа и начинаются с нуля; ассоциативные массивы используют произвольные строки.

Индексированные массивы создаются автоматически, если присваиваются любой переменной используя синтаксис

имя массива[индекс] = значение

Индекс рассматривается как арифметическое выражение, которое должно быть определено числом. Если в качестве индекса, возвращается число меньше нуля, то используется смещение от одного больше максимального индекса массива, например если значение -1 то относится к последнему элементу массива. Чтобы явно объявить индексированный массив, используйте

declare -a имя массива

Так же принимается с игнорированием индекса

declare -a имя [индекс]

Ассоциативные массивы создаются при помощи

declare -A name

Атрибуты могут быть определены для массива переменой с помощью встроенных команд declare и readonly. Каждый атрибут применяется ко всем частям массива.

Массивы назначаются с использованием соединений присвоения имя=(значение1 … значениеN) где каждое значение имеет вид [индекс]=строка. Индекс не обязателен. В том случае если он указан, то он используется в инструкции присваивания, в ином же случае в качестве индекса используется значение индекса которое было назначено, плюс один. Если индекс не указывается, индексация начинается с нуля.

Когда присваивается на ассоциативный массив, индекс не требуется. Так же этот формат можно использовать во встроенной команде declare. Отдельные элементы массива, могут быть назначены при помощи

имя[индекс]=значение

На любой элемент массива можно ссылаться с помощью ${имя[индекс]}. Фигурные скобки необходимы для того чтобы избежать конфликтов с путями расширений. Если в качестве индекса стоит «@» или «*», то слово значит все части названия. Эти индексы отличаются лишь тогда, когда это слово заключено в двойные кавычки. Если слово заключено в двойные кавычки, ${имя[*]} заменяется одним словом со значением каждого элемента массива, разделенных первым символом специальной переменной IFS, и ${имя[@]} расширяет каждый элемент имени отдельным словом. Когда нет составляющих массива, ${имя[@]} заменяется пустой строкой. Если расширение двойных кавычек происходит в пределах слова, расширение первого параметра объеденяется с начальной частью исходного слова, а расширение последнего параметра вместе с последней частью исходного слова. Это аналогично расширению специальных параметров «@» и «*» о них я писал немного раньше. ${#имя[индекс]} заменяется длиной ${имя[индекс]}. Если в качестве индекса «*» или «@», расширением является количество элементов в массиве. Ссылка на переменную массива без индекса, эквивалентна ссылке на массив с индексом 0.

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

Встроенная команда unset используется для уничтожения массивов. unset имя[индекс] уничтожает элемент массива с указанным индексом. Необходимо соблюдать осторожность, чтобы избежать нежелательных побочных эффектов, вызванных путями расширения. unset имя, где имя является массивом, или unset имя[индекс], где в качестве индекса указан «*» или «@», удаляется весь массив.

Встроенные команды declare, local и readonly, принимают -a option для указания индексированного массива, и -A option чтобы указать ассоциативный массив. Если подставляются оба варианта, -A имеет приоритет. Встроенная команда read принимает -a option, назначает список слов, прочитанных из стандартного ввода в массив. Встроенные команды set и declare, отображают значения массива таким образом, что позволяет им быть повторно использованными в качестве задания.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *