ИТ Блог. Администрирование серверов на основе Linux (Ubuntu, Debian, CentOS, openSUSE)

Массивы в Bash

Массивы в Bash

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

В этой статье мы расскажем о массивах Bash в Linux и о том, как использовать их в ваших сценариях Bash с помощью примеров.

 

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

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

В отличие от большинства языков программирования, элементы массива в 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.

 

В отличие от числового индексирования, ассоциативные массивы должны быть сначала объявлены с использованием встроенного объявления и опции -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 -a my_array=( "Водород" "Гелий" "Литий" "Бериллий" )

## напечатать элемент
echo ${my_array[1]}

Гелий

Если указанным индексом является @ или *, слово распространяется на все элементы массива. Чтобы напечатать все элементы, вы бы использовали:

## объявить массив
declare -a my_array=( "Водород" "Гелий" "Литий" "Бериллий" )

## напечатать все элементы
echo "${my_array[@]}"
Водород Гелий Литий Бериллий

Единственная разница между @ и * в том, что форма ${my_array[x]} окружена двойными кавычками. В этом случае * расширяется до одного слова, где элементы массива разделяются пробелом, и @ расширяет каждый элемент массива до отдельного слова. Это особенно важно при использовании формы для неграмотных элементов массива.

Вы также можете распечатать ключи массива, добавив оператор ! перед именем массива:

${!array_name[index]}

Например, чтобы напечатать все ключи, которые вы используете:

## объявить массив
declare -a my_array=( "Водород" "Гелий" "Литий" "Бериллий" )

## напечатать все элементы
echo "${!my_array[@]}"
0 1 2 3

Чтобы получить длину массива, используйте следующую форму:

${#array_name[@]}
Синтаксис такой же, как и при ссылке на все элементы плюс символ # перед именем массива.
## объявить массив
declare -a my_array=( "Водород" "Гелий" "Литий" "Бериллий" )

## длина массива
echo ${#my_array[@]}
4

Наиболее распространенный способ перебора каждого элемента в массиве — использование цикла for.

declare -a my_array=( "Водород" "Гелий" "Литий" "Бериллий" )

## Цикл по массиву
for i in "${my_array[@]}"
do 
  echo "$i"
done

Приведенный выше код будет перебирать массив и печатать каждый элемент в новой строке:

Водород
Гелий
Литий
Бериллий

Вот пример того, как распечатать все ключи и значения

declare -a my_array=( "Водород" "Гелий" "Литий" "Бериллий" )

## Цикл по массиву
for i in "${!my_array[@]}"
do
  echo "$i" "${my_array[$i]}"
done
0 Водород
1 Гелий
2 Литий
3 Бериллий

Другой способ перебрать массив — получить длину массива и использовать цикл в стиле C:

declare -a my_array=( "Водород" "Гелий" "Литий" "Бериллий" )

# длина массива
length=${#my_array[@]}

# Цикл по массиву
for (( i=0; i < ${length}; i++ ))
do
  echo $i ${my_array[$i]}
done
0 Водород
1 Гелий
2 Литий
3 Бериллий

Чтобы добавить новый элемент в массив bash и указать его индекс, используйте следующую форму:

my_array[index_n]="New Element"

Вот пример:

declare -a my_array=( "Водород" "Гелий" "Литий" "Бериллий" )

## Добавить новый элемент
my_array[9]="Aluminum"

## напечатать все элементы
echo "${my_array[@]}"
Водород Гелий Литий Бериллий Aluminum

Другой способ добавления нового элемента в массив без указания индекса — использование оператора +=. Вы можете добавить один или несколько элементов:

declare -a my_array=( "Водород" "Гелий" "Литий" "Бериллий" )

## добавить новый элемент
my_array+=( Кобальт Никель )

## напечатать все элементы
echo "${my_array[@]}"
Водород Гелий Литий Бериллий Кобальт Никель

Чтобы удалить один элемент, вам нужно знать индекс элемента. Элемент можно удалить с помощью команды unset:

unset my_array[index]

Давайте посмотрим на пример:

declare -a my_array=( "Водород" "Гелий" "Литий" "Бериллий" )

## удаление элемента
unset my_array[2]

## напечатать все элементы
echo "${my_array[@]}"
Водород Гелий Бериллий

К настоящему времени у вас должно быть хорошее понимание того, как использовать массивы bash в Linux. Мы показали вам, как создавать числовые индексированные и ассоциативные массивы, как перебирать массивы, вычислять длину массива, добавлять и удалять элементы.

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

Exit mobile version