Руководство по массивам 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

элементы доступа к массиву 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

Руководство по массивам 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.