Массивы — одна из наиболее часто используемых и фундаментальных структур данных. Вы можете думать о массиве как о переменной, которая может хранить в себе несколько переменных.
В этой статье мы рассмотрим массивы Bash и объясним, как их использовать в сценариях Bash.
Содержание
Bash массивы
Bash поддерживает одномерные типы массивов с числовым индексом и ассоциативные массивы. Для ссылок на числовые массивы используются целые числа, а для ассоциативных ссылок — с помощью строк.
Доступ к массивам с числовым индексом можно получить с конца, используя отрицательные индексы, индекс -1
ссылается на последний элемент. Индексы не обязательно должны быть смежными.
В отличие от большинства языков программирования, элементы массива Bash не обязательно должны иметь один и тот же тип данных. Вы можете создать массив, содержащий как строки, так и числа.
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
Выводы
Мы объяснили, как создавать числовые индексированные и ассоциативные массивы. Мы также показали, как перебирать массивы, вычислять длину массива, а также добавлять и удалять элементы.
Если у вас есть какие-либо вопросы или отзывы, не стесняйтесь оставлять комментарии.
Точно такая же статья — один в один с плохим переводом существует в Интернете, кто у кого «содрал» ???
У Вас хоть перевод нормальный — спасибо.