Ассоциативный массив 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 для начинающих