Массивы в сценариях оболочки

Умение использовать массивы в сценариях оболочки поможет эффективнее работать с большими наборами данных. Но что такое массивы и как их создавать? Давай разберемся!

Читайте также: Как использовать if-else в сценариях оболочки

Что такое массивы?

Скорее всего, вы сталкивались с массивами, если вы знакомы с базовыми понятиями любого языка программирования. В этом мануале мы рассмотрим основы массивов и научимся с ними работать.

Переменные хранят отдельные элементы данных. А массивы могут хранить практически неограниченное количество элементов данных. При работе с большим объемом данных переменные могут быть неэффективными, поэтому в таких ситуациях полезно использовать массивы.

Создание массивов в сценариях оболочки

Есть два типа массивов в сценариях оболочки:

  • Индексированные массивы — в них хранятся элементы с индексом (начиная с 0)
  • Ассоциативные массивы — хранятся элементы в виде пар ключ-значение (key-value)

По умолчанию создаются индексированные массивы. Если же вы указываете имена индексов, массив становится ассоциативным, а доступ к элементам можно получить при помощи этих имен, а не порядковых номеров.

Объявление массивов происходит так:

root@ubuntu:~# declare -A assoc_array
root@ubuntu:~# assoc_array[key]=value

или

root@ubuntu:~# declare -a indexed_array
root@ubuntu:~# indexed_array[0]=value

Обратите внимание на прописную и строчную буквы а. Прописная A используется для объявления ассоциативного массива, строчная a — для индексированного.

Ключевое слово declare используется для явного объявления массивов, но на самом деле оно не нужно. При создании массива можно просто инициализировать значения в зависимости от типа массива, который вам нужен, без явного его объявления.

Работа с массивами в сценариях оболочки

Теперь научимся работать с массивами в скриптах. Чтобы извлечь нужные точки данных, мы будем использовать в сценарии циклы и массивы одновременно.

1: Доступ к индивидуальным элементам массива

Каждая точка данных индексируется индивидуально. В приведенном ниже сценарии показано, как получить доступ ко всем элементам массива, указывая их индекс:

assoc_array[element1]="Hello World"
echo ${assoc_array[element1]}

Аналогично мы можем получить доступ к отдельным индексированным элементам массива. Поскольку индекс для каждого элемента генерируется автоматически, мы можем разделить их пробелами и указать все элементы массива index_array.

index_array=(1 2 3 4 5 6)
echo ${index_array[0]}

Как видите, первый элемент автоматически выводится по индексу 0.

2: Последовательное чтение элементов массива

Если вы уже знакомы с циклами for, вы можете легко извлекать элементы массива по порядку. С помощью циклов while или for можно перебрать элементы массива в сценариях оболочки. Скопируйте приведенный ниже скрипт и сохраните его как <filename>.sh.

#!/bin/bash
index_array=(1 2 3 4 5 6 7 8 9 0)

for i in ${index_array[@]}
do
        echo $i
done

Данный скрипт выводит следующее:

Возможно, вы обратили внимание на символ собачки в index_array[@], скоро мы поговорим о том, для чего он там нужен.

Встроенные операции с массивами в сценариях оболочки

Теперь, когда мы разобрали, как обращаться к отдельным элементам и как применять циклы for, давайте познакомимся со стандартными операциями для массивов.

Доступ ко всем элементам массива

При указании индекса или ключа можно получить доступ к определенному элементу массива. Но если вам нужно вывести все элементы одновременно или работать со всеми существующими элементами, можно применить другой оператор – символ [@].

В приведенном выше примере мы уже использовали этот символ, когда нужно было перебрать все элементы массива с помощью цикла for.

echo ${assoc_array[@]}

Команда выведет все элементы, которые хранятся в массиве assoc.

Подсчет элементов в массиве

Вывести количество элементов в массиве можно с помощью символа #, он может быть префиксом в имени массива. Давайте посмотрим, как это работает.

echo ${#index_array[@]}

Если нужно подсчитать количество символов в конкретном элементе, можно просто заменить символ @ индексом этого элемента.

Удаление элементов массива

Теперь разберем, как удалять из массивов отдельные элементы. Для этого есть ключевое слово unset.

unset index_array[1]

Чтобы удалить определенный элемент из массива, замените имя массива и идентификатор индекса в приведенном выше примере кода. 

Подводим итоги

Сценарии оболочки довольно широко применяются в повседневной работе и могут заменить любую функцию в терминале, но при условии, что скрипт написан правильно. Некоторые дополнительные функции массивов в сценариях оболочки включают возможность работы с регулярными выражениями. С помощью регулярных выражений можно управлять элементами массива в сценариях оболочки.

Добавить комментарий