Bash
如何從關聯數組創建 JSON
我正在 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"}]})
這同時使用
jo
和jq
。該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,我不能說如何以最好的方式執行這個結果。
也可以看看: