Массивы в Bash

Thank you for reading this post, don't forget to subscribe!

Масси­вы явля­ют­ся одной из наи­бо­лее исполь­зу­е­мых и фун­да­мен­таль­ных струк­тур дан­ных. Вы може­те думать, что мас­сив – это пере­мен­ная, кото­рая может хра­нить несколь­ко пере­мен­ных внут­ри него.

В этой ста­тье мы рас­ска­жем о мас­си­вах Bash в Linux и о том, как исполь­зо­вать их в ваших сце­на­ри­ях Bash с помо­щью примеров.

 

Bash под­дер­жи­ва­ет как одно­мер­ные чис­ло­вые, так и ассо­ци­а­тив­ные типы мас­си­вов. Чис­ло­вые мас­си­вы ссы­ла­ют­ся с исполь­зо­ва­ни­ем целых чисел, а ассо­ци­а­тив­ные – с исполь­зо­ва­ни­ем строк. Индек­сы не долж­ны быть смежными.

Чис­лен­но индек­си­ро­ван­ные мас­си­вы могут быть доступ­ны с кон­ца, исполь­зуя отри­ца­тель­ные индек­сы, индекс -1 ссыл­ка на послед­ний элемент.

В отли­чие от боль­шин­ства язы­ков про­грам­ми­ро­ва­ния, эле­мен­ты мас­си­ва в Bash не обя­за­тель­но долж­ны быть одно­го типа дан­ных. Вы може­те создать мас­сив, кото­рый содер­жит как стро­ки, так и чис­ла. Bash не под­дер­жи­ва­ет мно­го­мер­ные мас­си­вы, и у вас не может быть эле­мен­тов мас­си­ва, кото­рые так­же явля­ют­ся массивами.

Не суще­ству­ет огра­ни­че­ния на мак­си­маль­ное коли­че­ство эле­мен­тов, кото­рые могут быть сохра­не­ны в массиве.

 

Мас­си­вы в Bash могут быть ини­ци­а­ли­зи­ро­ва­ны раз­ны­ми способами.

 

Пере­мен­ные Bash явля­ют­ся нети­пи­зи­ро­ван­ны­ми, и любая пере­мен­ная может исполь­зо­вать­ся как индек­си­ро­ван­ный мас­сив, не объ­яв­ляя его.

Что­бы явным обра­зом объ­явить мас­сив, исполь­зуй­те встро­ен­ное объявление:

Одним из спо­со­бов созда­ния индек­си­ро­ван­но­го мас­си­ва явля­ет­ся исполь­зо­ва­ние сле­ду­ю­щей формы:

Где index_* поло­жи­тель­ное целое число.

Еще один спо­соб созда­ния чис­ло­во­го мас­си­ва – ука­зать спи­сок эле­мен­тов в скоб­ках, раз­де­лен­ных пробелом:

Когда мас­сив созда­ет­ся с исполь­зо­ва­ни­ем при­ве­ден­ной выше фор­мы, индек­са­ция начи­на­ет­ся с нуля, т.е. пер­вый эле­мент будет иметь индекс 0.

 

В отли­чие от чис­ло­во­го индек­си­ро­ва­ния, ассо­ци­а­тив­ные мас­си­вы долж­ны быть сна­ча­ла объ­яв­ле­ны с исполь­зо­ва­ни­ем встро­ен­но­го объ­яв­ле­ния и опции -A (в верх­нем регистре):

Для созда­ния ассо­ци­а­тив­но­го мас­си­ва исполь­зуй­те сле­ду­ю­щую форму:

Где index_может быть любая строка.

Вы так­же може­те создать ассо­ци­а­тив­ный мас­сив, исполь­зуя сле­ду­ю­щую форму:

Пона­ча­лу син­так­сис мас­си­вов Bash может пока­зать­ся немно­го стран­ным, но он ста­нет более понят­ным после про­чте­ния этой статьи.

 

Для ссыл­ки на один эле­мент вам нуж­но знать индекс эле­мен­та. На любой эле­мент мож­но ссы­лать­ся, исполь­зуя сле­ду­ю­щую форму:

При рабо­те с мас­си­ва­ми необ­хо­ди­мы фигур­ные скоб­ки ${}, что­бы избе­жать опе­ра­то­ров рас­ши­ре­ния име­ни оболочки.

Без фигур­ных ско­бок ${} син­так­сис для досту­па к эле­мен­ту мас­си­ва ана­ло­ги­чен син­так­си­су боль­шин­ства язы­ков программирования.

Напе­ча­та­ем эле­мент с индек­сом 1:

Если ука­зан­ным индек­сом явля­ет­ся @ или *, сло­во рас­про­стра­ня­ет­ся на все эле­мен­ты мас­си­ва. Что­бы напе­ча­тать все эле­мен­ты, вы бы использовали:

Един­ствен­ная раз­ни­ца меж­ду @ или * в том, когда фор­ма ${my_array[x]} окру­же­на двой­ны­ми кавыч­ка­ми. В этом слу­чае * рас­ши­ря­ет­ся до одно­го сло­ва, где эле­мен­ты мас­си­ва раз­де­ля­ют­ся про­бе­лом, и @ рас­ши­ря­ет каж­дый эле­мент мас­си­ва до отдель­но­го сло­ва. Это осо­бен­но важ­но при исполь­зо­ва­нии фор­мы для негра­мот­ных эле­мен­тов массива.

Вы так­же може­те рас­пе­ча­тать клю­чи мас­си­ва, доба­вив !опе­ра­тор перед име­нем массива:

Напри­мер, что­бы напе­ча­тать все клю­чи, кото­рые вы используете:

Что­бы полу­чить дли­ну мас­си­ва, исполь­зуй­те сле­ду­ю­щую форму:

Син­так­сис такой же, как и при ссыл­ке на все эле­мен­ты плюс #сим­вол перед име­нем массива.

Наи­бо­лее рас­про­стра­нен­ный спо­соб пере­бо­ра каж­до­го эле­мен­та в мас­си­ве – исполь­зо­ва­ние цик­ла for.

При­ве­ден­ный выше код будет пере­би­рать мас­сив и печа­тать каж­дый эле­мент в новой строке:

Вот при­мер того, как рас­пе­ча­тать все клю­чи и значения

Дру­гой спо­соб пере­брать мас­сив – полу­чить дли­ну мас­си­ва и исполь­зо­вать цикл в сти­ле C:

Что­бы доба­вить новый эле­мент в мас­сив bash и ука­зать его индекс, исполь­зуй­те сле­ду­ю­щую форму:

Вот при­мер:

Дру­гой спо­соб добав­ле­ния ново­го эле­мен­та в мас­сив без ука­за­ния индек­са – исполь­зо­ва­ние опе­ра­то­ра +=. Вы може­те доба­вить один или несколь­ко элементов:

Что­бы уда­лить один эле­мент, вам нуж­но знать индекс эле­мен­та. Эле­мент мож­но уда­лить с помо­щью коман­ды unset:

Давай­те посмот­рим на пример:

К насто­я­ще­му вре­ме­ни у вас долж­но быть хоро­шее пони­ма­ние того, как исполь­зо­вать мас­си­вы bash в Linux.