Введение
Массивы являются одной из наиболее часто используемых и фундаментальных структур данных. Вы можете думать, что массив — это переменная, которая может хранить в себе несколько переменных.
В этой статье мы рассмотрим массивы Bash и объясним, как их использовать в скриптах Bash.
Баш-массивы
Bash поддерживает одномерные массивы с числовым индексом и ассоциативные типы. На числовые массивы ссылаются с помощью целых чисел, а на ассоциации ссылаются с помощью строк.
Массивы с числовым индексом доступны с конца с использованием отрицательных индексов, индекс -1
является ссылкой на последний элемент. Индексы не обязательно должны быть смежными.
В отличие от большинства языков программирования, элементы массива Bash не обязательно должны иметь один и тот же тип данных. Вы можете создать массив, содержащий как строки, так и числа.
Bash не поддерживает многомерные массивы, и невозможно иметь элементы массива, которые также являются массивами.
Максимальное количество элементов, которые могут храниться в массиве, не ограничено.
Массивы в Bash можно инициализировать несколькими способами.
Создание массивов с числовым индексом
Переменные Bash не типизированы, любую переменную можно использовать как индексированный массив без ее объявления.
Чтобы явно объявить массив, используйте встроенную функцию declare
:
declare -a array_name
Одним из способов создания индексированного массива является использование следующей формы:
array_name[index_1]=value_1
array_name[index_2]=value_2
array_name[index_n]=value_n
Где index_*
— положительное целое число.
Другой способ создать числовой массив — указать список элементов в скобках, разделенных пробелом:
array_name=( element_1 element_2 element_N )
Когда массив создается с помощью формы выше, индексация начинается с нуля, т.е. первый элемент имеет индекс 0
.
Создание ассоциативных массивов
В отличие от числовой индексации, ассоциативные массивы должны быть объявлены до того, как их можно будет использовать.
Чтобы объявить ассоциативный массив, используйте встроенную команду declare
с параметром -A
(верхний регистр):
declare -A array_name
Ассоциативные массивы можно создавать с помощью следующего модуля:
declare -A array_name
array_name[index_foo]=value_foo
array_name[index_bar]=value_bar
array_name[index_xyz]=value_xyz
Где index_*
может быть любой строкой.
Вы также можете создать ассоциативный массив, используя следующую форму:
declare -A array_name
array_name=(
[index_foo]=value_foo
[index_bar]=value_bar
[index_xyz]=value_xyz
)
Операции с массивами
Синтаксис массивов Bash поначалу может показаться немного странным, но после прочтения этой статьи он станет более понятным.
Справочные элементы
Чтобы обратиться к одному элементу, вам нужно знать индекс элементов.
На любой элемент можно ссылаться, используя следующий синтаксис:
${array_name[index]}
${}
Мы печатаем элемент с индексом 1
:
## declare the array
declare -a my_array=( "Hydrogen" "Helium" "Lithium" "Beryllium" )
## print element
echo ${my_array[1]}
Helium
Если вы используете @
или *
в качестве индекса, слово расширяется до всех членов массива. Чтобы распечатать все элементы, вы должны использовать:
## declare the array
declare -a my_array=( "Hydrogen" "Helium" "Lithium" "Beryllium" )
## print all elements
echo "${my_array[@]}"
Hydrogen Helium Lithium Beryllium
Единственная разница между @
и *
заключается в том, что модуль ${my_array[x]}
заключен в двойные кавычки. В этом случае *
заменяется на одно слово, в котором элементы массива разделены пробелом. @
расширяет каждый элемент массива в отдельное слово. Это особенно важно при использовании модуля для разбора элементов массива.
Чтобы распечатать ключи массива, добавьте оператор !
перед именем массива:
${!array_name[index]}
Вот пример:
## declare the array
declare -a my_array=( "Hydrogen" "Helium" "Lithium" "Beryllium" )
## print all elements
echo "${!my_array[@]}"
0 1 2 3
Длина массивов
Чтобы получить длину массива, используйте следующую форму:
${#array_name[@]}
Синтаксис такой же, как и при ссылке на все элементы путем добавления символа #
перед именем массива.
## declare the array
declare -a my_array=( "Hydrogen" "Helium" "Lithium" "Beryllium" )
## array Length
echo ${#my_array[@]}
4
Пройтись по массиву
Наиболее распространенный способ перебора каждого элемента массива — использовать цикл for:
declare -a my_array=( "Hydrogen" "Helium" "Lithium" "Beryllium" )
## Array Loop
for i in "${my_array[@]}"
do
echo "$i"
done
Приведенный выше код будет повторять массив и печатать каждый элемент в новой строке:
Hydrogen
Helium
Lithium
Beryllium
Вот пример того, как напечатать все ключи и значения:
declare -a my_array=( "Hydrogen" "Helium" "Lithium" "Beryllium" )
## Array Loop
for i in "${!my_array[@]}"
do
echo "$i" "${my_array[$i]}"
done
0 Hydrogen
1 Helium
2 Lithium
3 Beryllium
Другой способ зацикливания массива — получить длину массива и использовать цикл в C style
:
declare -a my_array=( "Hydrogen" "Helium" "Lithium" "Beryllium" )
# Length of the array
length=${#my_array[@]}
# Array Loop
for (( i=0; i < ${length}; i++ ))
do
echo $i ${my_array[$i]}
done
0 Hydrogen
1 Helium
2 Lithium
3 Beryllium
Добавить новый элемент
Чтобы добавить новый элемент в массив bash и указать его индекс, используйте следующую форму:
my_array[index_n]="New Element"
Вот пример:
declare -a my_array=( "Hydrogen" "Helium" "Lithium" "Beryllium" )
## add new element
my_array[9]="Aluminum"
## print all elements
echo "${my_array[@]}"
Hydrogen Helium Lithium Beryllium Aluminum
Другой способ добавить новый элемент в массив без указания индекса — использовать оператор +=
. Вы можете добавить один или несколько элементов:
declare -a my_array=( "Hydrogen" "Helium" "Lithium" "Beryllium" )
## add new elements
my_array+=( Cobalt Nickel )
## print all elements
echo "${my_array[@]}"
Hydrogen Helium Lithium Beryllium Cobalt Nickel
Удалить элемент
Чтобы удалить один элемент, вам нужно знать индекс элемента. Элемент можно удалить с помощью команды unset
:
unset my_array[index]
Давайте посмотрим пример:
declare -a my_array=( "Hydrogen" "Helium" "Lithium" "Beryllium" )
## remove element
unset my_array[2]
## print all elements
echo "${my_array[@]}"
Hydrogen Helium Beryllium
Вывод
Мы объяснили, как создавать массивы с числовым индексом и ассоциативные массивы. Мы также показали, как перебирать массивы, вычислять длину массива, а также добавлять и удалять элементы.