
Массив (в некоторых языках программирования также таблица, ряд) — набор однотипных компонентов (элементов), расположенных в памяти непосредственно друг за другом, доступ к которым осуществляется по индексу (индексам). В отличие от списка, массив является структурой с произвольным доступом (Материал из Википедии).
В BASH имеется два вида массивов — Индексированные массивы (indexed arrays) и Ассоциативные массивы (Associative Arrays или hash-массивы). Ассоциативные массивы появились в BASH начиная с версии 4 и, хотя у них больше возможностей по сравнению с Индексированными массивами, последние до сих пор остаются наиболее используемыми. Тут мы будем рассматривать примеры с индексированными массивами. Для Ассоциативных массивов — позже будет отдельная статья.
Содержание
Инициализация массивов
Инициализация, или объявление массивов происходит либо явно, с использованием команды declare, либо при указании массива прямо в коде. Обратите внимание на то, что если не использовать команду declare — то массив по-умолчанию будет считаться индексированным.
Примеры объявления массивов:
$ declare -a array
$ array=( [1]=one [2]=two )
$ echo ${array[@]}
one two
Или без использования declare:
$ array2=( [1]=one [2]=two )
$ echo ${array2[@]}
one two
Другие способы инициализации индексированных массивов — без указания непосредственно индексов:
$ array3=(zero one two)
$ echo ${array3[@]}
zero one two
В таком случае индексы начинаются с нуля:
$ echo ${array3[0]}
zero
Ещё одна возможность определения массива:
$ array4[1]=four
$ echo ${array4[1]}
four
Но элемент с индексом [2] будет пустым:
$ echo ${array4[2]}
Индекс элемента массива — это целое положительное число (в случае индексированных массивов) либо «выражение» (string) — в случае ассоциативных массивов, определяющее имя и/или положение элемента массива.
Например, в массиве:
$ array2=( [1]=one [2]=two )
[1] и [2] являются индексами, которые определяют элементы массива — one и two соответственно. В случае индексированных массивов использование индексов не обязательно должно непрерывным. Например:
$ array5=( [1]=one [2]=two [5]=five )
$ echo ${array5[@]}
one two five
В случае использования массивов можно использовать некоторые возможности обычных переменных, например — вывести количество элементов массива:
$ echo ${#array5[@]}
3
Или вывести количество символов в определённом элементе массива:
$ array[3]=four
$ echo ${#array[3]}
4
Удаление элементов массива
Для удаления элемента массива используется та же команда, что и в случае переменных. Например — удалим элемент [2]=two из предыдущего примера:
$ echo ${array5[@]}
one two five
$ unset array5[2]
$ echo ${array5[@]}
one five
Так же можно удалить и все элементы массива:
$ unset array5[@]
$ echo ${array5[@]}
Аналогично удаляется и весь массив целиком:
$ unset array5
$ echo ${array5[@]}
Добавление и удаление элементов массива
Добавить новые элемент в конец массива:
$ array5=( [1]=one [2]=two [5]=five )
$ echo ${array5[@]}
one two five
$ array5+=(six)
$ echo ${array5[@]}
one two five six
В этом примере элемент добавляется последним. Так как выше был объявлен элемент с индексом [5] — то новый будет добавлен с индексом [6]:
$ echo ${array5[6]}
six
Или добавить в определённую позицию:
$ array5+=([3]=six)
$ echo ${array5[@]}
one two six five
Математические операции с элементами массива
Допустимо использование команды expr для выполнения операций над элементами.
Например — инициализировать элемент, который является суммой двух других элементов:
$ intArray=(1 2 3 4 5)
$ echo ${intArray[@]}
1 2 3 4 5
Добавляем новый элемент:
$ intArray[5]=`expr ${intArray[0]} + ${intArray[1]}`
$ echo ${intArray[5]}
3
Или умножение:
$ intArray[6]=`expr ${intArray[1]} * ${intArray[2]}`
$ echo ${intArray[6]}
6
Получение элемента массива
Определим массив:
$ intArray=(1 2 3 4 5)
$ echo ${intArray[@]}
1 2 3 4 5
Получить только первый элемент:
$ echo ${intArray[0]}
1
Или так (получить все элементы начиная с позиции 0, вывести 1 элемент):
$ echo ${intArray[@]:0:1}
1
Получить все элементы, начиная с позиции 3:
$ echo ${intArray[@]:2}
3 4 5
Получить 2 элемента массива, начиная с позиции 3:
$ echo ${intArray[@]:2:2}
3 4
Не забывайте, что если индексы элементов массива не были заданы явно — то они начинаются с 0.
Получить только последний элемент можно так:
$ echo ${intArray[@]:(-1)}
5
Или последние два параметра:
$ echo ${intArray[@]:(-2)}
4 5
Только предпоследний:
$ echo ${intArray[@]:(-2):1}
4
Переменные в массивах
В качестве элементов массива можно использовать обычные переменные.
Например:
$ a=1 $ b=2 $ c=3 $ array=($a $b $c)
$ echo ${array[@]}
1 2 3
Вложенные массивы
В качестве элемента массива можно задавать элемент из уже инициализированного массива.
Например:
$ echo ${array[@]}
1 2 3 four
$ subArray=( [1]=${array[0]} [2]=${array[1]} )
Тут мы создаём новый массив, у которого элемент с индексом [1] получает значение из массива array и его элемента [0], а элемент [2] массива subArray — получает значение элемента [1] массива array:
$ echo ${subArray[@]}
1 2
Другой пример, аналогичный первому:
$ subArray=( [1]=${array[@]:0:1} [2]=${array[@]:1:1} )
Тоже самое:
$ echo ${subArray[@]}
1 2
Наполнение массива
Получить все строки из файла и добавить их элементами массива можно так:
$ cat test.log Boom ERROR ERROR ERROR ERROR Boom ERROR Boom
$ unset array $ array=( `cat "test.log"` )
$ echo ${array[@]}
Boom ERROR ERROR ERROR ERROR Boom ERROR Boom
Или так:
$ array=( $(cat "test.log") )
$ echo ${array[@]}
Boom ERROR ERROR ERROR ERROR Boom ERROR Boom
Другой пример — получить PID всех процессов Java и занести их в массив:
$ unset array
$ array=( `ps aux | grep java | awk '{print $2}'` )
$ echo ${array[@]}
14435 14469 14487 15736 15737 17603 26548 27436
Или так:
$ unset array
$ array=( $(ps aux | grep java | awk '{print $2}') )
$ echo ${array[@]}
14435 14469 14487 15736 15737 17603 26548 27496
Массивы так же можно использовать в циклах, например:
$ for i in "${array[@]}"; do echo "$i"; done
14435
14469
14487
15736
15737
17603
26548
27496
Примеры использования массивов можно найти в скриптах BASH: функция проверки значения элемента в массиве и LDAP + BASH: скрипт резервного копирования и восстановления базы данных LDAP.
UPD 11.2016 Ещё один пример использования массивов: BASH: массивы, пример — скрипт получения логов из Docker-контейнеров
Ссылки по теме
http://mywiki.wooledge.org
http://www.thegeekstuff.com
http://poplinux.ru
http://www.linuxjournal.com
http://rus-linux.net