Как создать JSON из ассоциативного массива

Значение PrivateTmpдолжно быть в части [Service]единицы измерения.

1
21.12.2020, 17:49
1 ответ
#!/bin/bash

declare -A rep_hostname
rep_hostname=( [test1]='172.1.1.1' [test2]='172.1.1.2' [test3]='172.1.1.3' )

json=$(
        jo _id=opino-rs members="$(
                jo -a "${rep_hostname[@]/%/:2701}" |
                jq -c 'to_entries | map({ "_id":.key, "host":.value })'
        )"
)

printf 'rs.initiate(%s)\n' "$json"

Тестирование:

$ bash script.sh
rs.initiate({"_id":"opino-rs","members":[{"_id":0,"host":"172.1.1.3:2701"},{"_id":1,"host":"172.1.1.2:2701"},{"_id":2,"host":"172.1.1.1:2701"}]})

Здесь используются как jo, так и jq. Утилита jo— это инструмент для создания JSON в оболочке. joпозаботится о том, чтобы сгенерированный JSON был правильно процитирован и закодирован. Утилита jq— это инструмент для разбора и обработки JSON в оболочке.

Я использую joдля создания списка имен хостов в формате JSON из списка IP-адресов в вашем ассоциативном массиве. Перед созданием массива JSON я добавляю :2701в конец каждого IP-адреса посредством подстановки параметров.

$ jo -a "${rep_hostname[@]/%/:2701}"
["172.1.1.3:2701","172.1.1.2:2701","172.1.1.1:2701"]

Это считывается jq, который изменяет его в список объектов JSON, которые мы хотим назначить клавише membersв окончательном JSON:

$ jo -a "${rep_hostname[@]/%/:2701}" | jq -c 'to_entries | map({ "_id":.key, "host":.value })'
[{"_id":0,"host":"172.1.1.3:2701"},{"_id":1,"host":"172.1.1.2:2701"},{"_id":2,"host":"172.1.1.1:2701"}]

Это снова используется в качестве входных данных для joдля создания окончательного документа JSON.

В конце скрипта сгенерированный документ JSON просто вставляется в скобки в строке rs.initiate()с помощью вызова printf.

Поскольку я не использую MongoDB, я не могу сказать, как лучше всего выполнить результат этого.

См. также:

1
18.03.2021, 22:41

Теги

Похожие вопросы