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