Массивы в сценариях оболочки
Development | Комментировать запись
Умение использовать массивы в сценариях оболочки поможет эффективнее работать с большими наборами данных. Но что такое массивы и как их создавать? Давай разберемся!
Читайте также: Как использовать 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]
Чтобы удалить определенный элемент из массива, замените имя массива и идентификатор индекса в приведенном выше примере кода.
Подводим итоги
Сценарии оболочки довольно широко применяются в повседневной работе и могут заменить любую функцию в терминале, но при условии, что скрипт написан правильно. Некоторые дополнительные функции массивов в сценариях оболочки включают возможность работы с регулярными выражениями. С помощью регулярных выражений можно управлять элементами массива в сценариях оболочки.