Что такое словари Bash в Linux, и как их использовать

Словари Bash дают вам хэш-карты и ассоциативные массивы в сценариях оболочки Linux. Мы покажем вам, как использовать эти мощные и полезные структуры данных в ваших собственных сценариях оболочки Linux.


A Rose by Any Other Name

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

Массив - это коллекция значений данных, хранящихся в одной структуре данных. Чтобы получить доступ к любому из значений данных, которые называются элементами массива, необходимо знать их положение в массиве. Позиция элемента массива в массиве называется его индексом, поэтому такие массивы называются индексированными. Это наиболее часто используемый тип массивов.

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

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

Вы можете найти значение в ассоциативном массиве, выполнив поиск по его ключевому слову. Поиск слова и получение связанного с ним значения напоминает поиск слова в словаре и нахождение его значения. Именно поэтому ассоциативные массивы называют словарями.


Bash 4.0 или выше

Ассоциативные массивы поддерживаются в оболочке Bash версии 4.0 или выше. Если вы используете текущий дистрибутив Linux, все должно быть в порядке. Чтобы проверить версию Bash, выполните следующую команду:

bash --version

На машине, использованной для исследования этой статьи, установлен Bash 5.1.4, так что все в порядке.


Основные принципы

Чтобы создать ассоциативный массив в командной строке терминала или в сценарии, мы используем команду Bash declare. Параметр -A (ассоциативный) указывает Bash, что это будет ассоциативный, а не индексированный массив.

declare -A acronyms

Это создает ассоциативный массив "acronyms."

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

имя массива[ключ]=значение

Добавим некоторые элементы массива: acronyms[ACK]=Acknowledgementacronyms[BGP]="Border Gateway Protocol "acronyms[CIDR]="Classless Inter-Domain Routing "acronyms[DHCP]="Dynamic Host Configuration Protocol "acronyms[EOF]="End of Frame"

Эти команды определяют пять элементов массива. Обратите внимание, что значения заключены в кавычки, если в них есть пробелы. Наши ключевые слова были введены в алфавитном порядке, но их можно вводить в любом порядке. Ключевые слова должны быть уникальными. Если вы попытаетесь создать две записи с одним и тем же ключевым словом, второе введенное вами значение перезапишет первое. У вас останется только одна запись с таким ключевым словом, и она будет связана со вторым значением, которое вы добавили.

Для получения значений из массива мы используем команды в таком формате:

${имя массива[ключ]}

Мы можем использовать echo для отправки вывода в окно терминала: echo ${acronyms[ACK]}echo ${acronyms[DHCP]}


Использование циклов

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

Мы создаем массивы с помощью команды declare (та же опция -A, что и раньше), но мы предоставляем ключевые слова и значения в виде списка в командной строке.

declare -A countries=( [ALB]=Albania [BHR]=Bahrain [CMR]=Cameroon [DNK]=Denmark [EGY]=Egypt )

Имя массива - "countries", и он связан со списком значений знаком равенства " =". Список значений заключен в круглые скобки "()", а каждое ключевое слово заключено в скобки "[]". Обратите внимание, что значения не разделяются запятыми. Если строка значений содержит пробелы, ее нужно заключить в кавычки.

Чтобы заставить ассоциативный массив возвращать ключевое слово вместо значения, добавьте восклицательный знак "!" перед именем массива. Символ "@" может использоваться как подстановочный знак, означающий все элементы массива.

В этом цикле for будут перечислены все ключевые слова:

for key in "${!countries[@]}"; do echo $key; done

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

Мы также можем использовать расширение параметров, чтобы перечислить все ключевые слова. Они будут перечислены в одной строке, а не по одному на строку.

echo "${!countries[@]}"echo "${!acronyms[@]}"

Мы можем дополнить наш цикл for, чтобы вывести ключевые слова и значения одновременно.

for key in "${!acronyms[@]}"; do echo "$key - ${acronyms[$key]}"; done

Если мы хотим узнать, сколько элементов в массивах, мы можем использовать хэш "#" перед именем массива вместо восклицательного знака. echo "${!countries[@]}"echo "${!acronyms[@]}"


Проверка существования элемента массива

Если вы ищете ключевое слово, но такого элемента массива не существует, возвращаемое значение будет пустой строкой. Иногда полезно иметь другой индикатор наличия или отсутствия элемента массива.

Мы можем проверить наличие элемента массива с помощью оператора "+_". Обратите внимание, что он идет после ключевого слова, а не перед именем массива, как предыдущие рассмотренные операторы. if [ ${acronyms[EOF]+_} ]; then echo "Найдено"; else echo "Не найдено"; fiif [ ${acronyms[FTP]+_} ]; then echo "Found"; else echo "Not found"; fi

Элемент массива с ключевым словом "EOF" найден в массиве, а элемент массива с ключевым словом "FTP" - нет.


Добавление элементов массива

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

Для добавления нового элемента в массив мы используем оператор "+=".

countries+=( [FJI]=Fiji )echo "$(#countries[@]}"echo ${countries[FJI]}

Количество элементов в массиве теперь шесть, и поиск по ключевому слову new находит элемент массива и возвращает его значение.

Количество элементов в массиве теперь шесть.

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

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

unset acronyms[EOF]if [ ${acronyms[EOF]+_} ]; then echo "Found"; else echo "Not found"; fi

Чтобы удалить весь массив, используйте unset с именем массива.

unset countries


Использование переменных с массивами

Использование переменных с ассоциативными массивами очень просто. В этом примере мы зададим переменной key строку "EOF". Мы будем использовать переменную, когда добавим в массив новый элемент массива. На самом деле, мы заменяем элемент массива, который мы удалили ранее.

Мы получим новый элемент массива, вызвав его с помощью ключевого слова new, а также используя переменную. Если ключевое слово содержит пробелы, имя переменной нужно заключить в кавычки.

key=EOFacronyms[$key]="End of Frame "echo ${acronyms[EOF]}echo ${acronyms[$key]}


Get Creative

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

declare -A specificationspecification[CPU]="Dual Core AMD Ryzen 5 3600 "specification[Speed]="3600 MHz "specification[Kernel]="5.11.0-17-generic x86_64 "specification[Mem]="1978. 5 MiB "specification[Storage]="32 GiB "specification[Shell]="Bash "echo ${specification[CPU]}

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

Ваше имя: *
Ваш e-mail: *
Код: Кликните на изображение чтобы обновить код, если он неразборчив
Введите код: