Авторский канал для тех, кто хочет глубже погрузиться в мир Linux.
Подойдет для разработчиков, системных администраторов и DevOps
Реклама: @dad_admin
Post #161
1K
Обработка многомерных массивов и ассоциативных списков в Bash
Bash не поддерживает многомерные массивы на уровне языка, но это не мешает нам создавать их с помощью ассоциативных массивов или хитрых обходных путей. Сегодня про то, как это сделать.
1️⃣ Ассоциативные массивы как таблицы. С Bash 4+ появились ассоциативные массивы (declare -A), что позволяет организовать данные в виде таблицы:
📌 Мы используем ключи вида userX,property, чтобы эмулировать двумерную структуру.
2️⃣ Многомерные массивы через вложенные списки. Если нужно хранить массив внутри массива, можно использовать строки с разделителем:
📌 Здесь IFS=":" read -r ... разбивает строку на переменные.
3️⃣ Итерация по многомерной структуре. Перебираем всех пользователей и их данные:
📌 !users[@] возвращает список всех ключей.
4️⃣ JSON-подход с jq. Если сложность растет, лучше работать с JSON:
BashTex 📱 #linux #utils
Bash не поддерживает многомерные массивы на уровне языка, но это не мешает нам создавать их с помощью ассоциативных массивов или хитрых обходных путей. Сегодня про то, как это сделать.
1️⃣ Ассоциативные массивы как таблицы. С Bash 4+ появились ассоциативные массивы (declare -A), что позволяет организовать данные в виде таблицы:
declare -A users
users["user1,name"]="Egor"
users["user1,age"]=25
users["user2,name"]="Ivan"
users["user2,age"]=30
echo "Имя user1: ${users["user1,name"]}" # Egor
echo "Возраст user2: ${users["user2,age"]}" # 30
📌 Мы используем ключи вида userX,property, чтобы эмулировать двумерную структуру.
2️⃣ Многомерные массивы через вложенные списки. Если нужно хранить массив внутри массива, можно использовать строки с разделителем:
declare -A servers
servers["db"]="192.168.1.10:5432:PostgreSQL"
servers["web"]="192.168.1.20:80:Nginx"
IFS=":" read -r ip port service <<< "${servers["db"]}"
echo "Сервер базы: IP=$ip, Порт=$port, Сервис=$service"
📌 Здесь IFS=":" read -r ... разбивает строку на переменные.
3️⃣ Итерация по многомерной структуре. Перебираем всех пользователей и их данные:
for key in "${!users[@]}"; do
echo "$key -> ${users[$key]}"
done
📌 !users[@] возвращает список всех ключей.
4️⃣ JSON-подход с jq. Если сложность растет, лучше работать с JSON:
json='{"user1": {"name": "Egor", "age": 25}, "user2": {"name": "Ivan", "age": 30}}'
echo "$json" | jq '.user1.name' # Egor
BashTex 📱 #linux #utils
- 👍 11
