다음과 같이 JSON 출력을 생성해야 합니다.
[{
"Service": "service1-name",
"AWS Account": "service1-dev",
"AD Accounts": {
"APP-Service1-Admin": ["a", "b"],
"APP-Service1-View": ["c", "d"]
}
}
]
이 쉘 스크립트를 시도하고 있지만 내부 정보를 삽입할 수 없습니다
#!/bin/bash
innerAD=$(jq -n --arg aaaa aaaa \
--arg xxxx "xxxx" \
'$ARGS.named'
)
inner=$(jq -n --argjson "APP-Service1-Admin" "[$innerAD]" \
'$ARGS.named'
)
final=$(jq -n --arg Service "service1-name" \
--arg "AWS Account" "service1-dev" \
--argjson "AD Accounts" "[$inner]" \
'$ARGS.named'
)
echo "$final"
답변1
--args
한 가지 제안은 with를 사용하여 jq
두 개의 배열을 만든 다음 기본 문서의 올바른 위치에 수집하는 것입니다. 이는 --args
명령줄의 마지막 옵션이어야 하며모두나머지 명령줄 매개변수는 $ARGS.positional
배열의 요소가 됩니다.
{
jq -n --arg key APP-Service1-Admin '{($key): $ARGS.positional}' --args a b
jq -n --arg key APP-Service1-View '{($key): $ARGS.positional}' --args c d
} |
jq -s --arg key 'AD Accounts' '{($key): add}' |
jq --arg Service service1-name --arg 'AWS account' service1-dev '$ARGS.named + .'
처음 두 jq
호출은 두 개의 JSON 개체 집합을 만듭니다.
{
"APP-Service1-Admin": [
"a",
"b"
]
}
{
"APP-Service1-View": [
"c",
"d"
]
}
세 번째 호출은 컬렉션을 배열로 읽는 jq
데 사용되며 , 이 배열은 전달될 때 병합된 개체가 됩니다 . 병합된 객체는 최상위 키에 할당됩니다.-s
add
{
"AD Accounts": {
"APP-Service1-Admin": [
"a",
"b"
],
"APP-Service1-View": [
"c",
"d"
]
}
}
마지막으로 jq
나머지 최상위 키와 해당 값을 객체에 추가합니다.
{
"Service": "service1-name",
"AWS account": "service1-dev",
"AD Accounts": {
"APP-Service1-Admin": [
"a",
"b"
],
"APP-Service1-View": [
"c",
"d"
]
}
}
그리고 jo
:
jo -d . \
Service=service1-name \
'AWS account'=service1-dev \
'AD Accounts.APP-Service1-Admin'="$(jo -a a b)" \
'AD Accounts.APP-Service1-View'="$(jo -a c d)"
"내부" 개체는 .
-notation( 활성화하여 -d .
)과 배열 생성을 위한 여러 명령 대체를 사용하여 생성됩니다.
또는 -d .
배열 표기 형식을 제거하고 사용할 수 있습니다.
jo Service=service1-name \
'AWS account'=service1-dev \
'AD Account[APP-Service1-Admin]'="$(jo -a a b)" \
'AD Account[APP-Service1-View]'="$(jo -a c d)"
답변2
Bash에서 복잡한 json 객체를 생성할 때 나는 종종 heredocs를 사용합니다:
service=$(thing-what-gets-service)
account=$(thing-what-gets-account)
admin=$(jo -a $(thing-what-gets-admin))
view=$(jo -a $(thing-what-gets-view))
read -rd '' json <<EOF
[
{
"Service": "$service",
"AWS Account": "$account",
"AD Accounts": {
"APP-Service1-Admin": $admin,
"APP-Service1-View": $view
}
}
]
EOF
jo
이는 매우 간단한 방법이지만 원하는 경우 다르게 수행할 수 있으므로 배열을 만드는 데 사용됩니다 .
답변3
또 다른 jo
답변:
# 2 shell arrays
admins=("a" "b")
views=("c" "d")
accounts=$(jo "${admins[@]/#/APP_Service1-Admin[]=}" "${views[@]/#/APP_Service1-View[]=}")
final=$(jo "Service=service1-name" "AWS Account=service1-dev" "AD Accounts=$accounts")
echo "$final" | jq .
{
"Service": "service1-name",
"AWS Account": "service1-dev",
"AD Accounts": {
"APP_Service1-Admin": [
"a",
"b"
],
"APP_Service1-View": [
"c",
"d"
]
}
}
까다로운 부분은 다음과 같습니다."${admins[@]/#/APP_Service1-Admin[]=}"
$ printf '%s\n' "${admins[@]/#/APP_Service1-Admin[]=}"
APP_Service1-Admin[]=a
APP_Service1-Admin[]=b
이를 통해 쉘 배열에서 목록을 작성할 수 있습니다.
답변4
엑스오(1)명령줄에서 JSON을 생성하는 데 유용한 유틸리티입니다. 그것은에서 온다libxo주니퍼 네트웍스가 개발한 프로젝트. 편리하게도 사전 설치되어 제공됩니다.11.0-RELEASE 이후의 FreeBSDJSON, XML 등 다른 형식으로 출력할 수도 있습니다. 이는 많은 FreeBSD 관리 도구에서 사용되는 메커니즘입니다(예:참고(1)) 기계 친화적인 출력 형식을 지원합니다.
다음은 매뉴얼 페이지의 샘플 출력입니다.
$ xo --style text "The {k:name} weighs {:weight/%d} pounds.\n" fish 6
The fish weighs 6 pounds.
$ xo --style xml "The {k:name} weighs {:weight/%d} pounds.\n" fish 6
<name>fish</name>
<weight>6</weight>
$ xo --style json "The {k:name} weighs {:weight/%d} pounds.\n" fish 6
"name": "fish",
"weight": 6
"name": "fish",
$ xo --style html "The {k:name} weighs {:weight/%d} pounds.\n" fish 6
<div class="line">
<div class="text">The </div>
<div class="data" data-tag="name">fish</div>
<div class="text"> weighs </div>
<div class="data" data-tag="weight">6</div>
<div class="text"> pounds.</div>
</div>