Руководство по массивам Bash
Опубликовано: 2022-12-30В этом руководстве по массивам Bash вы узнаете, как объявлять и работать с индексированными и ассоциативными массивами в Bash.
В Bash вы можете создавать массивы для хранения набора элементов. Массивы Bash — это одномерные коллекции. В языках программирования, таких как C и C++, массивы представляют собой наборы элементов одного типа данных. Однако в Bash, в зависимости от варианта использования, вы можете хранить целые числа и строки в одном массиве.
В этом руководстве вы узнаете, как объявить массив Bash и получить доступ к его элементам. Затем вы узнаете, как перебирать элементы массива и добавлять элементы в массив. Наконец, вы узнаете об ассоциативных массивах в Bash.
Давайте начнем!
Заинтересованы в кодировании вместе? Вот предварительные условия:
- Если вы работаете на компьютере Mac или Linux, вы можете открыть свой терминал и кодировать.
 - Если вы работаете на компьютере с Windows, установите Git Bash или подсистему Windows для Linux (WSL2).
 
Как объявить массив Bash
В этом разделе вы изучите синтаксис объявления массива Bash и примеры кода.
Синтаксис объявления массива Bash
Вы можете объявить массив в Bash, используя следующий синтаксис:
 $ arrayName=(elt1 elt2 ... eltN) # arrayName is the name of the array # elt1 through eltN are the N elements in the array В приведенном выше синтаксисе arrayName обозначает имя массива, содержащего N элементов elt1...eltN .
 Элементы массива заключаются между открывающей и закрывающей скобками () . Также обратите внимание, что элементы массива разделены пробелом . Как и в случае с любой переменной Bash, перед оператором присваивания = или после него не должно быть пробелов .
В большинстве других языков программирования вы будете разделять элементы массива или подобных коллекций запятыми. Но в Bash разделителем является пробел.
В Bash такие массивы, в которых элементы идентифицируются по их индексу, называются индексированными массивами .
Объявление индексированных массивов в Bash
 Давайте создадим prices , массив чисел.
 $ prices=(24 27 18 30 15)Как указано в синтаксисе, числа в массиве
pricesразделены пробелом, заключенным в круглые скобки, без пробелов до и после оператора присваивания =.
 В Bash вы можете использовать команду echo для вывода значения переменной. Использование $variableName распечатывает значение variableName . Однако вы можете видеть, что при использовании имени массива выводится только первый элемент.
 $ echo $prices 24Массивы Bash следуют нулевой индексации. Таким образом, первый элемент имеет индекс 0, второй элемент имеет индекс 1 и так далее. Вы также можете использовать отрицательную индексацию; индекс последнего элемента массива равен -1.
Что произойдет, если вы попытаетесь получить доступ к элементу по определенному индексу и распечатать его? Давайте попробуем распечатать элемент с индексом 1.
 $ echo $prices[1] 24[1] Почему на выходе 24[1]? Это связано с тем, что Bash заменяет $prices на 24, первый элемент массива, и [1] выводится как таковой.
 Чтобы распечатать элемент по определенному индексу, вы можете использовать расширение параметра формы ${prices[index]} .
 $ echo ${prices[1]} # 27 $ echo ${prices[2]} # 18 Чтобы распечатать все элементы массива, вы можете указать @ вместо определенного индекса.
 $ echo ${prices[@]} 24 27 18 30 15Далее создадим массив строк. Выполнение следующей команды создает индексированный массив:
 $ declare -a fruits Опция -a создает индексированный массив. Теперь вы можете заполнять массив по одному элементу за раз, объявляя элемент по определенному индексу, как показано ниже:
 $ fruits[0]="cherry" $ fruits[1]="berry" $ fruits[2]="apple" $ fruits[3]="pear" $ fruits[4]="melon" $ fruits[5]="orange" Теперь, чтобы распечатать все элементы массива, вы можете использовать ${fruits[@]} .
 $ echo ${fruits[@]} cherry berry apple pear melon orangeДоступ к элементам массива Bash

Вы можете получить доступ к элементам массива следующими способами:
- Перебрать массив и получить прямой доступ к элементу
 - Перебрать набор индексов и получить доступ к элементам по определенному индексу
 
Цикл по массиву и элементам доступа
Если вы программировали на Python, вы использовали цикл for со следующим синтаксисом:
 for elt in some_list: print(elt)Теперь давайте напишем Bash-эквивалент описанного выше цикла for.
 Мы знаем, что {prices[@]} расширяется до всех элементов массива prices . И ${prices[@]} дает нам значения всех элементов.
 Цикл for в Bash похож на синтаксис цикла for в Python, но операторы в теле цикла должны быть заключены в do и done , как показано ниже:
 $ for price in ${prices[@]} > do > echo $price > done Поскольку мы используем команду echo и распечатываем значение переменной price , мы получаем следующий вывод:
 # output 24 27 18 30 15Доступ к элементам с помощью индекса массива
 Другой способ обхода массивов — использование индекса элементов. Это похоже на конструкцию цикла for в Python, использующую функцию range() :

 for i in range(len(some_list)): print(i) Чтобы получить список индексов для циклического просмотра, вы можете поставить восклицательный знак ( ! ) перед именем массива в расширении параметра. Это даст вам список всех допустимых индексов для массива, как показано ниже:
 $ echo ${!prices[@]} 0 1 2 3 4 Массив prices содержит 5 элементов, поэтому индекс начинается с 0 и увеличивается до 4.
 Затем мы можем пройтись по списку индексов и получить доступ к элементу по каждому индексу. Для индекса i ${prices[i]} — это элемент с индексом i .
 $ for i in ${!prices[@]} > do > echo ${prices[i]} > doneПриведенный выше цикл выводит все элементы массива.
 # output 24 27 18 30 15Здесь после доступа к каждому элементу мы выполняем простую операцию вывода его значения. В общем, у нас может быть любая допустимая обработка элементов.
Добавление элементов в массив Bash

 В массиве prices у нас пять элементов (с индексами 0,1,2,3 и 4). Если вы хотите добавить элемент в конец массива с индексом 5, вы можете сделать это следующим образом:
 $ prices[5]=21Мы видим, что 21 добавлено в конец массива цен.
 $ echo ${prices[@]} 24 27 18 30 15 21Однако удобнее добавлять в конец массива — не запоминая — индекс последнего добавленного элемента или количество элементов, находящихся в данный момент в массиве.
 Вы можете использовать arrayName+=(elements(s)) для добавления одного или нескольких элементов в массив, как показано ниже:
 $ prices+=(10) Теперь, если мы распечатаем массив prices , мы увидим, что 10 добавлено в конец массива.
 $ echo ${prices[@]} 24 27 18 30 15 21 10Далее давайте узнаем, как объявлять ассоциативные массивы в Bash.
Ассоциативные массивы в Bash
 Если вы хотите определить отношения с помощью пар ключ-значение, вы можете использовать ассоциативный массив . Вы можете объявить ассоциативный массив, используя следующий общий синтаксис. Обратите внимание, что мы используем параметр -A вместо -a .
 $ declare -A fruits_pricesВы можете добавлять элементы в ассоциативный массив, указав ключ и соответствующее значение. Здесь мы добавили названия фруктов в качестве ключей и числа из массива цен в качестве значений.
 $ fruits_prices[cherry]=24 $ fruits_prices[berry]=27 $ fruits_prices[apple]=18 $ fruits_prices[pear]=30 $ fruits_prices[melon]=15 $ fruits_prices[orange]=21Так как же нам получить доступ к элементам ассоциативного массива?
Точно так же, как вы искали бы значение, используя соответствующий ключ в словаре Python, вы можете получить доступ к значениям в ассоциативном массиве, используя ключи.
 $ echo ${fruits_prices[berry]} # 27 Мы видим, что ${fruits_prices[@]} на значения, а ${!fruits_prices[@]} на ключи.
 $ echo ${fruits_prices[@]} # Output: 18 27 21 24 30 15 $ echo ${!fruits_prices[@]} # Output: apple berry orange cherry pear melonПримечание . Порядок элементов не совпадает с порядком их добавления. Это связано с тем, что, в отличие от индексированных массивов, ассоциативные массивы не являются упорядоченными коллекциями. Скорее, они работают над связью между ключами и значениями. Следовательно, ключи для ассоциативных массивов — это то же самое, что индексы для индексированных массивов.
Вы также можете пройтись по ассоциативному массиву и получить доступ к ключам, как показано ниже:
 $ for key in ${!fruits_prices[@]} > do > echo $key > done # Output apple berry orange cherry pear melonСледующий цикл показывает, как вы можете получить доступ к значениям.
 $ for value in ${fruits_prices[@]} > do > echo $value > done # Output 18 27 21 24 30 15 Хотя рекомендуется использовать arrayName[key]=value , вы также можете объявить его как последовательность, подобную этой:
 declare -A arrayName arrayName=(key1 value1 key2 value2 ... keyN valueN)Таким образом, Bash выводит первый элемент как первый ключ, второй элемент как первое значение и так далее.
Подводя итоги
Надеюсь, теперь вы понимаете, как создавать массивы Bash и работать с ними. Вот краткий обзор того, что вы узнали.
-  Вы можете объявить индексированный массив в Bash, используя синтаксис 
arrayName=(elt1 elt2 elt3 ... eltN)или запуститьdeclare -a arrayNameи добавить элементы в массив. -  Чтобы получить доступ к элементам, вы можете выполнить цикл, используя 
${arrayName[@]}. Кроме того, вы можете получить список всех допустимых индексов, используя расширение параметра${!arrayName[@]}. - Наконец, вы также узнали, как объявить ассоциативный массив для хранения пар ключ-значение в Bash.
 
Затем ознакомьтесь с руководством по циклам в Bash.
