Bash

如何從關聯數組創建 JSON

  • December 22, 2020

我正在 CentOS 7.5 上編寫一個 bash 腳本,它將執行一些 MongoDB 命令。這些命令之一將設置複製伺服器。根據項目,伺服器的數量可以不同。

我有這個關聯數組,它是主機名和伺服器的 IP(我使用了關聯數組,因為程式碼的其他部分需要它)。在此範例中,我有三台伺服器:

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

當擁有三台伺服器時,我必須執行以下命令:

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

如果我的陣列有兩個伺服器,我有這個:

 rs.initiate( { _id : "opino-rs", members: [ { _id: 0, host: "172.1.1.1:2701" }, 
 { _id: 1, host: "172.1.1.2:2701" } ]})  

我需要生成這個命令然後執行它。問題是我無法生成它。我嘗試了一些程式碼,它們甚至不接近我想要的。

我怎樣才能做到這一點?

#!/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"}]})

這同時使用jojq。該jo實用程序是用於在 shell 中創建 JSON 的工具。jo將確保生成的 JSON 被正確引用和編碼。該jq實用程序是用於在 shell 中解析和處理 JSON 的工具。

我正在使用jo從關聯數組中的 IP 地址列表創建主機名的 JSON 列表。在創建 JSON 數組之前,我:2701通過參數替換將每個 IP 地址添加到末尾。

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

這是讀取jq它修改它到我們想要分配給members最終 JSON 中的鍵的 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,我不能說如何以最好的方式執行這個結果。

也可以看看:

引用自:https://unix.stackexchange.com/questions/625501