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