Массив - это структура данных, которая представляет собой набор объектов с одним и тем же типом данных. Bash это не полноценный язык программирования, но он также поддерживает переменные типа массива.
Объявленная как массив переменная может хранить несколько значений. В зависимости от того, как осуществляется доступ к значениям из массива, bash поддерживает два типа массивов: ассоциативные массивы или одномерные индексированные массивы. В ассоциативных массивах доступ к значениям осуществляется с помощью соответствующих ключей. Индексированные массивы - это упорядоченные списки, в которых вы можете получить доступ к значениям по их индексу (позиции в списке).
Создание индексированного массива в Bash
Переменные в bash не строго типизированы. Например, переменную bash можно рассматривать как строки или целые числа, можно обеспечить типичное поведение в bash, объявив "атрибут" переменной. Bash позволяет явно объявить переменную как индексированный массив, используя встроенную команду объявления с параметром -a
1 | declare -a [имя переменной] |
Инициализация индексированных массивов в Bash
Массивы в Bash могут хранить целые числа, либо строки. Переменная массива может быть инициализирована массивом целых чисел или массивом строк, так же возможно хранение целые числа и строки в одном массиве. Bash поддерживает только одномерные массивы, т.е. создать массив массивов не представляется возможным.
В качестве разделителя в массиве используется пробел, это необходимо учитывать при создании массива строк.
Явное объявление массива
1 | declare -a array1=(2 3 5 7 11 13 17 19 23 29 31) |
Неявное объявление массива
1 | array2=(red blue green black) |
массив содержащий цифры и строки
1 | array3=(200 300 "red " 700 "green ") |
Чтение и запись значений в массив
Для чтения или записи значений в определенной позиции индекса в индексированном массиве, необходимо указывать индекс в квадратных скобках. Чтобы прочитать элемент, необходимо использовать дополнительные фигурные скобки вокруг имени массива.
1 2 | array_test[0]=foobar # запись echo ${array_test[0]} # чтение |
Определение длины массива
Для определения длины массива, используется выражение с символами # и @.
1 2 | array2=(red blue green black) echo "Size: ${#array2[@]}" |
Добавление значений в массив
Для массивов bash нет ограничений на максимальный размер.
Bash позволяет динамически увеличивать длину массива, динамически добавлять одно или несколько значений в конец. Для этого используется оператор +=.
1 2 3 | declare -a array2=(red blue) array2+=(green) array2+=(black white) |
Возможно добавление значений в массив следующим способом
1 2 | array2=(red blue) array2=(${array2[@]} black white) |
Так же возможен вариант, с использованием длины массива
1 | array2[${#array2[@]}]=carmine |
Использование массивов в цикле
Для перебора значений можно использовать цикл for
1 2 3 4 5 6 | declare -a acolor=(red yellow carmine gray black white) for color in ${acolor[@]}; do echo $color done |
Так возможно перебирать массив, используя индексы массива
1 2 3 4 5 6 | declare -a acolor=(red yellow carmine gray black white) for i in ${!acolor[@]}; do echo ${acolor[$i]} done |
Вывод массива
Возможно вывести значение массива в цикле, это позволить обеспечить доступ к элементам массива и их обработку, но если просто необходимо вывести все значения массива, то можно использовать конструкцию <имя массива>[@]
1 2 | acolor=(red yellow skyblue gray black white) echo ${acolor[@]} |
Получение части массивов в Bash
Bash позволяет получать часть значений из массива в виде последовательных подмножество значений (например, значения от индекса 3 до 6)
Получить значения всего массива
1 | ${array[@]} |
Получить количество элементы (len), начиная с индекса (index)
1 | ${array[@]:index:len} |
Получить количество элементы (len), начиная с 0 индекса
1 | ${array[@]::len} |
Получить все элементы массива начиная с индекса
1 | ${array[@]:index} |
Примеры:
1 2 3 4 5 6 7 8 9 10 11 12 13 | declare -a acolor=(red brown yellow gray black white pink purple auburn) #весь массив echo "${acolor[@]}" #Получить 2 значения, начиная с индекса 3 echo "${acolor[@]:3:2}" #Получить первые 5 значений echo "${acolor[@]::5}" # Получить значения, начиная с индекса 4 до конца echo "${acolor[@]:4}" |