Использование массивов в Bash

Allsoft

Массив - это структура данных, которая представляет собой набор объектов с одним и тем же типом данных. Bash это не полноценный язык программирования, но он также поддерживает переменные типа массива.
Объявленная как массив переменная может хранить несколько значений. В зависимости от того, как осуществляется доступ к значениям из массива, bash поддерживает два типа массивов: ассоциативные массивы или одномерные индексированные массивы. В ассоциативных массивах доступ к значениям осуществляется с помощью соответствующих ключей. Индексированные массивы - это упорядоченные списки, в которых вы можете получить доступ к значениям по их индексу (позиции в списке).

Создание индексированного массива в Bash

Переменные в bash не строго типизированы. Например, переменную bash можно рассматривать как строки или целые числа, можно обеспечить типичное поведение в bash, объявив "атрибут" переменной. Bash позволяет явно объявить переменную как индексированный массив, используя встроенную команду объявления с параметром -a

declare -a <имя переменной>

Инициализация индексированных массивов в Bash

Массивы в Bash могут хранить целые числа, либо строки. Переменная массива может быть инициализирована массивом целых чисел или массивом строк, так же возможно хранение целые числа и строки в одном массиве. Bash поддерживает только одномерные массивы, т.е. создать массив массивов не представляется возможным.

В качестве разделителя в массиве используется пробел, это необходимо учитывать при создании массива строк.

Явное объявление массива

declare -a array1=(2 3 5 7 11 13 17 19 23 29 31)

Неявное объявление массива

array2=(red blue green black)

массив содержащий цифры и строки

array3=(200 300 "red " 700 "green ")

Чтение и запись значений в массив

Для чтения или записи значений в определенной позиции индекса в индексированном массиве, необходимо указывать индекс в квадратных скобках. Чтобы прочитать элемент, необходимо использовать дополнительные фигурные скобки вокруг имени массива.

array_test[0]=foobar # запись
echo ${array_test[0]} # чтение

Определение длины массива

Для определения длины массива, используется выражение с символами # и @.

array2=(red blue green black)
echo "Size: ${#array2[@]}"

Добавление значений в массив

Для массивов bash нет ограничений на максимальный размер.

Bash позволяет динамически увеличивать длину массива, динамически добавлять одно или несколько значений в конец. Для этого используется оператор +=.

declare -a array2=(red blue)
array2+=(green)
array2+=(black white)

Возможно добавление значений в массив следующим способом

array2=(red blue)
array2=(${array2[@]} black white)

Так же возможен вариант, с использованием длины массива

array2[${#array2[@]}]=carmine

Использование массивов в цикле

Для перебора значений можно использовать цикл for

declare -a acolor=(red yellow carmine gray black white)

for color in ${acolor[@]}; do
    echo $color
done

Так де возможно перебирать массив, используя индексы массива

declare -a acolor=(red yellow carmine gray black white)

for i in ${!acolor[@]}; do
    echo ${acolor[$i]}
done

Вывод массива

Возможно вывести значение массива в цикле, это позволить обеспечить доступ к элементам массива и их обработку, но если просто необходимо вывести все значения массива, то можно использовать конструкцию <имя массива>[@]

acolor=(red yellow skyblue gray black white)
echo ${acolor[@]}

Получение части массивов в Bash

Bash позволяет получать часть значений из массива в виде последовательных подмножество значений (например, значения от индекса 3 до 6)

Получить значения всего массива

${array[@]}

Получить количество элементы (len), начиная с индекса (index)

${array[@]:index:len}

Получить количество элементы (len), начиная с 0 индекса

${array[@]::len}

Получить все элементы массива начиная с индекса

${array[@]:index}

Примеры:

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}"

 

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