저는 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를 사용하지 않기 때문에 이 결과를 가장 잘 수행하는 방법을 알 수 없습니다.
또한보십시오: