Поиск по сайту:

Ассоциативный массив Bash, объясненный примерами в Linux

Это вторая статья в рамках bash-массивов. В предыдущей статье мы обсудили, как работать с индексированными массивами в Bash. В этом руководстве мы подробно обсудим Ассоциативный массив Bash на примерах в Linux.

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

Давайте углубимся и посмотрим, как использовать ассоциативный массив в bash.

Инициализировать ассоциативный массив

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

Используйте команду declare с флагом -A.

declare -A STAR_PLAYERS=()

Теперь создается пустой массив с именем "STAR_PLAYERS". При желании вы также можете добавлять элементы в массив непосредственно во время инициализации.

declare -A STAR_PLAYERS=( [Argentina]="Messi" [Brazil]="Neymar" [England]="Kane" )

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

Для лучшей читаемости вы можете записать элементы массива в несколько строк.

declare -A STAR_PLAYERS=(
 [Argentina]="Messi"
 [Brazil]="Neymar"
 [England]="Rooney"
)

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

Вам нужно использовать команду echo или printf в bash, чтобы распечатать содержимое массива. Подобно тому, как мы использовали специальные переменные * и @ для печати индексированного массива, то же самое следует использовать и для печати ассоциативных массивов.

echo ${STAR_PLAYERS[@]}
echo ${STAR_PLAYERS[*]}

Распечатать Ассоциативный массив

Существует значительная разница между * и @, а также знать разницу между * и @ и то, как она работает. с массивом, обратитесь к разделу «Цикл по элементам массива» в нашем руководстве по Bash For Loop.

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

echo ${STAR_PLAYERS}

Вывести массив без * или @

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

echo ${STAR_PLAYERS[Brazil]}

Распечатать конкретный элемент

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

Добавить новый элемент в массив очень просто. Все, что вам нужно сделать, это создать новую пару ключ-значение, как показано ниже.

STAR_PLAYERS[Belgium]="Hazard"
echo ${STAR_PLAYERS[@]}

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

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

STAR_PLAYERS[England]="Sterling"
echo ${STAR_PLAYERS[@]}

Переопределить значение

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

Вы также можете добавлять элементы в массив, используя следующий синтаксис.

STAR_PLAYERS+=([Spain]="Ramos")
echo ${STAR_PLAYERS[@]}

Добавить значение в массив

Распечатать пару ключей и значений

Из предыдущих примеров вы, возможно, поняли, что печатаются только значения. Вы можете получить только список ключей, добавив к массиву префикс символа "!".

echo ${!STAR_PLAYERS[@]}

Распечатывать ключи отдельно

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

for elem in "${!STAR_PLAYERS[@]}"
do
 echo "key : ${elem}" -- "value: ${STAR_PLAYERS[${elem}]}"
done

Печать ключей и значений

Длина ассоциативного массива

Вы можете получить длину ассоциативного массива, то есть общее количество элементов, присутствующих в массиве, добавив к массиву префикс символа "#". Это также характерно для индексированных массивов.

echo ${#STAR_PLAYERS[@]}

Длина массива

Проверьте, присутствует ли элемент в массиве

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

Я использую условный оператор с флагом -n, который проверяет, не равна ли длина строки, возвращаемой из $ {STAR_PLAYERS[Argentina], отличной от нуля. Он расширяет данный ключ, и значение фактически проверяется по флагу -n.

if [[ -n "${STAR_PLAYERS[Argentina]}" ]] 
then
  echo "Element is present"
else
  echo "Element not present"
fi

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

Ассоциативный массив только для чтения

Вы можете сделать ассоциативный массив доступным только для чтения. В состоянии только для чтения после инициализации массива вы не можете добавлять в него новые элементы или изменять какие-либо значения в массиве. Вместе с командой declare вам необходимо использовать флаг -r.

declare -r -A STAR_PLAYERS=(
 [Argentina]="Messi"
 [Brazil]="Neymar"
 [England]="Rooney"
)
STAR_PLAYERS[Spain]="Ramos"
STAR_PLAYERS[England]="Sterling"
echo ${STAR_PLAYERS[@]}

Ассоциативный массив только для чтения

Удалить элементы

Если вы хотите удалить какой-либо конкретный элемент из массива, вы можете использовать команду unset с именем ключа элемента. Например, если я хочу удалить элемент (Spain="Ramos"), то синтаксис должен быть следующим.

unset STAR_PLAYERS[Spain]

Удалить конкретный элемент

Очистить массив

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

echo ${STAR_PLAYERS[@]}
declare -A STAR_PLAYERS=()

Сделать массив пустым

Удалить массив

Если вы хотите удалить массив, вы можете использовать имя массива без каких-либо ключей.

unset STAR_PLAYERS

Удалить массив

Заключение

В этой статье мы рассмотрели что такое ассоциативные массивы в bash и некоторые их функциональные возможности. Недостаток bash заключается в том, что вам придется либо писать некоторую логику вручную, либо использовать внешние инструменты для достижения желаемого результата. Например, когда мне нужно преобразовать ассоциативный массив в объекты json, мне нужно использовать инструмент jq, который не встроен в bash. Именно здесь вам следует попробовать использовать Python, который предлагает простые в использовании методы для работы с массивами и другими структурами данных.

Связанное чтение:

  • Скрипты Bash: циклы while и Until с примерами
  • Скрипты Bash: цикл For с примерами
  • Скрипты Bash: функции, поясняемые примерами
  • Скрипты Bash: переменные, поясняемые примерами
  • Перенаправление Bash, объясненное примерами
  • Команда Bash Echo с примерами для Linux
  • Руководство по Bash Heredoc для начинающих

Статьи по данной тематике