Как использовать массивы в сценариях Bash в Linux

12 set 2022 3 min di lettura
Как использовать массивы в сценариях Bash в Linux
Indice dei contenuti

Введение

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

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

Баш-массивы

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

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

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

Вывод

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

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.