Ръководство за 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)

Както е споменато в синтаксиса, числата в масива с цени са разделени с интервал, ограден в скоби, без интервали преди и след оператора за присвояване =.

  Как да получите 7-дневен безплатен пробен период на Philo

В 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 цикъл.

Знаем, че {цени[@]} разширява до всички елементи в масива цени. И ${цени[@]} ни дава стойностите на всички елементи.

  13 Профилиране на софтуер за отстраняване на грешки в производителността на приложението

Цикълът 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)), за да добавите един или повече елементи към масив, както е показано:

$ prices+=(10)

Сега, ако отпечатаме масива с цени, ще видим, че 10 е добавено към края на масива.

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

След това нека научим как да декларираме асоциативни масиви в Bash.

  Как да хакнете скритата игра с динозавър в Google Chrome

Асоциативни масиви в 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]=стойност, можете също да го декларирате като последователност като тази:

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.