json을 변수로 사용하지만 null 오류가 발생함

json을 변수로 사용하지만 null 오류가 발생함

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

코드에 두 가지 뚜렷한 오류가 있습니다. 다행히도 둘 다 쉽게 고칠 수 있습니다.

  1. 명령줄에 오타가 있습니다. jq실제 표현식 문자열 앞에 공백이 없습니다.

    ... --arg 5b "$PRIMARYPVTIPOCID5"'[{
    

    ~해야 한다

    ... --arg 5b "$PRIMARYPVTIPOCID5" '[{
    
  2. 내부 jq변수의 이름은 숫자로 시작할 수 없습니다. 이는 모든 $1a동일한 변수가 유효하지 않음을 의미합니다. 숫자와 문자( $1a--> $a1등)를 바꿔 이러한 변수 이름을 유효하게 만드세요.

  • 이상적으로는 인용도 해야 합니다.모두ociJSON 문서를 보유하는 변수뿐만 아니라 최종 호출의 변수입니다 .

보너스: 약간 더 컴팩트한 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()추가합니다 .nametargetIdport

관련 정보