Linux

使用 json 作為變數但出現空錯誤

  • August 28, 2022

我正在嘗試使用 json 作為 bash 腳本中的變數。

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=null

有人可以幫我 TIA

您的程式碼中有兩個非常不同的錯誤。幸運的是,兩者都很容易修復。

  1. 命令行中有一個錯字,實際jq表達式字元串之前缺少空格:
... --arg 5b "$PRIMARYPVTIPOCID5"'[{

應該

... --arg 5b "$PRIMARYPVTIPOCID5" '[{
  1. 內部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() | { ... } ]返回一個對像數組,其中只有正確的ipAddresstargetId鍵以及對應的值。map()然後通過兩次呼叫擴展這些對象。第一個map()將靜態數據添加到每個元素,而第二個map()添加name鍵,其值取決於先前設置的targetId和鍵。port

引用自:https://unix.stackexchange.com/questions/715232