次のように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
1つの提案は、withを使用してjq
2つの配列を作成し、基本文書の正しい場所に収集することです。これは--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 + .'
最初の 2 つjq
の呼び出しは、2 つの JSON オブジェクトのセットを作成します。
{
"APP-Service1-Admin": [
"a",
"b"
]
}
{
"APP-Service1-View": [
"c",
"d"
]
}
3番目の呼び出しはコレクションを配列に読み込む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
XO(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>