Как использовать массивы в Bash

9 feb 2024 4 min di lettura
Как использовать массивы в Bash
Indice dei contenuti

Введение

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

В этой статье мы рассмотрим массивы 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.

Создание ассоциативных массивов

Ассоциативные массивы — это тип массива, в котором каждый элемент идентифицируется уникальным ключом, а не индексом.

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

Чтобы объявить ассоциативный массив, используйте встроенную 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, массивы в 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

Заключение

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

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

Buy me a coffeeBuy me a coffee

Supportaci se ti piacciono i nostri contenuti. Grazie.

Successivamente, completa il checkout per l'accesso completo a Noviello.it.
Bentornato! Accesso eseguito correttamente.
Ti sei abbonato con successo a Noviello.it.
Successo! Il tuo account è completamente attivato, ora hai accesso a tutti i contenuti.
Operazione riuscita. Le tue informazioni di fatturazione sono state aggiornate.
La tua fatturazione non è stata aggiornata.