Массивы Bash Arrays

Bash Arrays

12 Мая 2020 | Терминал

В этой статье мы рассмотрим массивы Bash и объясним, как их использовать в ваших скриптах Bash.

Массивы Bash Arrays

Массивы являются одной из наиболее используемых и фундаментальных структур данных. Вы можете думать, что массив - это переменная, которая может хранить несколько переменных внутри него.


Bash Arrays 

Bash поддерживает одномерные числовые и ассоциативные типы массивов. Числовые массивы ссылаются с помощью целых чисел, а ассоциативные - с использованием строк.

Численно индексированные массивы могут быть доступны с конца, используя отрицательные индексы, индекс -1 ссылок на последний элемент. Индексы не должны быть смежными.

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

Bash не поддерживает многомерные массивы, и вы не можете иметь элементы массива, которые также являются массивами.

Не существует ограничения на максимальное количество элементов, которые могут быть сохранены в массиве.

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

Массивы в Bash могут быть инициализированы разными способами.

Создание численно проиндексированных массивов

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

Чтобы явным образом объявить массив, используйте встроенное объявление:

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
 

Вывод

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

    Комментарии

    Если у вас есть вопросы, не стесняйтесь оставлять комментарии ниже.

Загрузка комментариев...