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