Linux
使用 json 作為變數但出現空錯誤
我正在嘗試使用 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
您的程式碼中有兩個非常不同的錯誤。幸運的是,兩者都很容易修復。
- 命令行中有一個錯字,實際
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
鍵以及對應的值。map()
然後通過兩次呼叫擴展這些對象。第一個map()
將靜態數據添加到每個元素,而第二個map()
添加name
鍵,其值取決於先前設置的targetId
和鍵。port