bashスクリプトでjsonを変数として使用しようとしています。
JSON=$(
jq -n -c --arg 1a "$PRIMARYPVTIP1" --arg 1b "$PRIMARYPVTIPOCID1" --arg 2a "$PRIMARYPVTIP2" --arg 2b "$PRIMARYPVTIPOCID2" --arg 3a "$PRIMARYPVTIP3" --arg 3b "$PRIMARYPVTIPOCID3" --arg 4a "$PRIMARYPVTIP4" --arg 4b "$PRIMARYPVTIPOCID4" --arg 5a "$PRIMARYPVTIP5" --arg 5b "$PRIMARYPVTIPOCID5"'[{
ipAddress: $1a,
isBackup: false,
isDrain: false,
isOffline: false,
name: ($1b + ":11011"),
port: 11011,
targetId: $1b,
weight: 1
},
{
ipAddress: $2a,
isBackup: false,
isDrain: false,
isOffline: false,
name: ($2b + ":11011"),
port: 11011,
targetId: $2b,
weight: 1
},
{
ipAddress: $3a,
isBackup: false,
isDrain: false,
isOffline: false,
name: ($3b + ":11011"),
port: 11011,
targetId: $3b,
weight: 1
},
{
ipAddress: $4a,
isBackup: false,
isDrain: false,
isOffline: false,
name: ($4b + ":11011"),
port: 11011,
targetId: $4b,
weight: 1
},
{
ipAddress: $5a,
isBackup: false,
isDrain: false,
isOffline: false,
name: ($5b + ":11011"),
port: 11011,
targetId: $5b,
weight: 1
}]'
)
/bin/oci --profile $USER nlb backend-set update \
--backend-set-name $BACKENDSETNAME \
--network-load-balancer-id $NLBOCID \
--backends "$JSON" \
--force
以下のようにエラーが発生します。
++ jq -n -c --arg 1a 100.100.100.101 --arg 1b ocid1.privateip.oc1.ap-mumbai-1.abrg6ljrf6ink5hr5huugsjp4ibe5tfmszo76okxkhytnxxl4fxzfabhg7gq --arg 2a 100.100.100.102 --arg 2b ocid1.privateip.oc1.ap-mumbai-1.abrg6ljr4jz3os5x66p4u6xuzys2etcauw4e7ncp4tjm5h2l2in7gotth6hq --arg 3a 100.100.100.103 --arg 3b ocid1.privateip.oc1.ap-mumbai-1.abrg6ljrcvy4dcpag3ru4iu6qpswpaixayeowbh5l2tbajzd6q3ifwdax45q --arg 4a 100.100.100.104 --arg 4b ocid1.privateip.oc1.ap-mumbai-1.abrg6ljrmcto6xtjxstccijpwxucixgvg4pxmk6zghjrqgckhhizjfdvp2gq --arg 5a 100.100.100.105 --arg 5b 'ocid1.privateip.oc1.ap-mumbai-1.abrg6ljrldpkuo2byuar7vh6vofmtxejrstgi24n6dpixhsvvmjos2huhn6q[{
ipAddress: $1a,
isBackup: false,
isDrain: false,
isOffline: false,
name: ($1b + ":11011"),
port: 11011,
targetId: $1b,
weight: 1
},
{
ipAddress: $2a,
isBackup: false,
isDrain: false,
isOffline: false,
name: ($2b + ":11011"),
port: 11011,
targetId: $2b,
weight: 1
},
{
ipAddress: $3a,
isBackup: false,
isDrain: false,
isOffline: false,
name: ($3b + ":11011"),
port: 11011,
targetId: $3b,
weight: 1
},
{
ipAddress: $4a,
isBackup: false,
isDrain: false,
isOffline: false,
name: ($4b + ":11011"),
port: 11011,
targetId: $4b,
weight: 1
},
{
ipAddress: $5a,
isBackup: false,
isDrain: false,
isOffline: false,
name: ($5b + ":11011"),
port: 11011,
targetId: $5b,
weight: 1
}]'
+ JSON=null
+ /bin/oci --profile SERDY nlb backend-set update --backend-set-name boom --network-load-balancer-id ocid1.networkloadbalancer.oc1.ap-mumbai-1.amaaaaaakfvuezya7tkgva6g3d5qjl6fsr3oy64k4xhcwxzcvxyoie4v6mlq --backends null --force
見せていると見ることができます。JSON=空
誰でも私を助けることができますか?
答え1
コードには2つの異なるエラーがあります。幸い、どちらも簡単に修正できます。
コマンドラインにタイプミスがあります。
jq
実際の式文字列の前にスペースはありません。... --arg 5b "$PRIMARYPVTIPOCID5"'[{
しなければならない
... --arg 5b "$PRIMARYPVTIPOCID5" '[{
内部
jq
変数の名前は数字で始めることはできません。これは、すべての$1a
同じ変数が無効であることを意味します。数字と文字($1a
-->$a1
など)を変更してこれらの変数名を有効にします。
- 理想的には引用もしなければなりません。みんな
oci
JSONドキュメントを保持する変数だけでなく、最終呼び出しの変数です。
ボーナス:少しコンパクトなJSON構造:
args=(
100.100.100.101 ocid1.privateip.oc1.ap-mumbai-1.abrg6ljrf6ink5hr5huugsjp4ibe5tfmszo76okxkhytnxxl4fxzfabhg7gq
100.100.100.102 ocid1.privateip.oc1.ap-mumbai-1.abrg6ljr4jz3os5x66p4u6xuzys2etcauw4e7ncp4tjm5h2l2in7gotth6hq
100.100.100.103 ocid1.privateip.oc1.ap-mumbai-1.abrg6ljrcvy4dcpag3ru4iu6qpswpaixayeowbh5l2tbajzd6q3ifwdax45q
100.100.100.104 ocid1.privateip.oc1.ap-mumbai-1.abrg6ljrmcto6xtjxstccijpwxucixgvg4pxmk6zghjrqgckhhizjfdvp2gq
100.100.100.105 ocid1.privateip.oc1.ap-mumbai-1.abrg6ljrldpkuob2yuar7vh6vofmtxejrstgi24n6dpixhsvvmjos2huhn6q
)
JSON=$(
jq -n '
[
range(0;$ARGS.positional|length;2) |
{ ipAddress: $ARGS.positional[.], targetId: $ARGS.positional[.+1] }
] |
map( . += { isBackup: false, isDrain: false, isOffline: false, weight: 1, port: 11011 } ) |
map( . += { name: ([.targetId, .port] | join(":")) })' --args "${args[@]}"
)
ここで最初のものは、[ range() | { ... } ]
正しいipAddress
キーtargetId
とその値のみを含むオブジェクトの配列を返します。その後、これらのオブジェクトは2回の呼び出しで展開されますmap()
。 1つ目はmap()
各要素に静的データを追加し、2つ目は以前に設定されたキーによって値が異なるキーを追加しますmap()
。name
targetId
port