Значение PrivateTmp
должно быть в части [Service]
единицы измерения.
#!/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, я не могу сказать, как лучше всего выполнить результат этого.
См. также: