연관 배열에서 JSON을 생성하는 방법

연관 배열에서 JSON을 생성하는 방법

저는 CentOS 7.5에서 일부 MongoDB 명령을 실행할 bash 스크립트를 작성 중입니다. 이러한 명령 중 하나는 복제 서버를 설정합니다. 프로젝트에 따라 서버 수는 달라질 수 있습니다.

서버의 호스트 이름과 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" } ]})  

이 명령을 생성한 다음 실행해야 합니다. 문제는 그것을 생성할 수 없다는 것이다. 일부 코드를 시도해 보았지만 내가 원하는 코드와도 가깝지 않습니다.
어떻게 해야 하나요?

답변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를 사용하지 않기 때문에 이 결과를 가장 잘 수행하는 방법을 알 수 없습니다.

또한보십시오:

관련 정보