Посібник із масивів Bash

У цьому посібнику про масиви Bash ви дізнаєтесь, як оголошувати індексовані та асоціативні масиви та працювати з ними в Bash.

У Bash ви можете створювати масиви для зберігання колекції елементів. Масиви Bash є одновимірними колекціями. У мовах програмування, таких як C і C++, масиви є наборами елементів одного типу даних. Однак у Bash, залежно від варіанту використання, ви можете зберігати цілі числа та рядки в одному масиві.

У цьому посібнику ви дізнаєтеся, як оголосити масив Bash і отримати доступ до його елементів. Потім ви дізнаєтесь, як циклювати елементи масиву та додавати елементи до масиву. Нарешті, ви дізнаєтеся про асоціативні масиви в Bash.

Давайте почнемо!

⚙ Хочете кодувати? Ось передумови:

Як оголосити масив 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=(24 27 18 30 15)

Як зазначено в синтаксисі, числа в масиві цін відокремлюються пробілом, укладеним у дужки, без пробілів перед і після оператора присвоєння =.

У Bash ви можете використовувати команду echo, щоб вивести значення змінної. Використання $variableName друкує значення variableName. Однак ви бачите, що використання імені масиву друкує лише перший елемент.

$ echo $prices
24

Масиви Bash слідують за нульовою індексацією. Отже, перший елемент має індекс 0, другий елемент має індекс 1 і так далі. Ви також можете використовувати негативну індексацію; індекс останнього елемента масиву -1.

  5 надійних хостингів ExpressionEngine для вашого онлайн-бізнесу

Що станеться, якщо ви спробуєте отримати доступ до елемента з певним індексом і роздрукувати його? Давайте спробуємо роздрукувати елемент під індексом 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.

Ми знаємо, що {ціни[@]} розширюється до всіх елементів у масиві цін. І ${ціни[@]} дає нам значення всіх елементів.

Цикл Bash for подібний до синтаксису циклу for Python, але оператори в тілі циклу повинні бути укладені в do і done, як показано:

$ for price in ${prices[@]}
> do
> echo $price
> done

Оскільки ми використовуємо команду echo та друкуємо значення змінної ціни, ми отримуємо такий результат:

# 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

Масив цін містить 5 елементів, тому індекс починається з 0 і досягає 4.

  Як виправити непрацюючий мікрофон AirPods

Далі ми можемо прокрутити список індексів і отримати доступ до елемента за кожним індексом. Для індексу i ${prices[i]} – це елемент з індексом i.

$ for i in ${!prices[@]}
> do
> echo ${prices[i]}
> done

Наведений вище цикл друкує всі елементи в масиві.

# output
24
27
18
30
15

💬 Тут після доступу до кожного елемента ми виконуємо просту операцію друку його значення. Загалом, ми можемо мати будь-яку дійсну обробку елементів.

Додавання елементів до масиву Bash

У масиві цін ми маємо п’ять елементів (з індексами 0,1,2,3 і 4). Якщо ви хочете додати елемент у кінець масиву з індексом 5, ви можете зробити це наступним чином:

$ prices[5]=21

Ми бачимо, що 21 було додано в кінець масиву цін.

$ echo ${prices[@]}
24 27 18 30 15 21

Однак зручніше додати в кінець масиву — не запам’ятовуючи — індекс останнього доданого елемента або кількість елементів, які наразі містяться в масиві.

Ви можете використовувати arrayName+=(elements(s)) it, щоб додати один або більше елементів до масиву, як показано:

$ prices+=(10)

Тепер, якщо ми роздрукуємо масив цін, ми побачимо, що 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

Отже, як отримати доступ до елементів асоціативного масиву?

  Як повернути старий інтерфейс чату Steam

Подібно до того, як ви шукаєте значення за допомогою відповідного ключа в словнику 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.