連想配列からJSONを生成する方法

連想配列からJSONを生成する方法

私はCentOS 7.5でいくつかのMongoDBコマンドを実行するbashスクリプトを書いています。これらのコマンドの1つはレプリケーションサーバーを設定します。プロジェクトによっては、サーバーの数が異なる場合があります。

サーバーのホスト名とIPである連想配列があります(コードの他の部分で必要なため、連想配列を使用しています)。この例では、3 つのサーバーがあります。

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

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

私のアレイに2つのサーバーがある場合は、次のようになります。

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

このコマンドを生成して実行する必要があります。問題はそれを生成できないということです。いくつかのコードを試してみましたが、私が望むコードにも近いわけではありません。
どうすればいいですか?

答え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連想配列の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最終JSONのキーに割り当てたいJSONオブジェクトのリストに変更します。members

$ 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文書を作成するための入力として再利用されます。

rs.initiate()スクリプトの最後に生成されたJSONドキュメントは、呼び出しを使用して文字列の角かっこに挿入されますprintf

私はMongoDBを使用していないので、この結果を最もよく実行する方法はわかりません。

また見なさい:

関連情報