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