programing

변수를 사용하여 bash 스크립트에 JSON을 직접 저장하시겠습니까?

lastmoon 2023. 2. 26. 10:27
반응형

변수를 사용하여 bash 스크립트에 JSON을 직접 저장하시겠습니까?

"아니, 다른 방법을 찾아봐"라는 말로 서문을 쓰도록 하겠습니다.

동일한 스크립트에서 실행되는 AWS CLI 명령에서 사용할 수 있도록 JSON의 짧은 비트를 bash 변수에 저장하는 안정적인 방법이 있습니까?

저는 Jenkins에서 AWS Route53 레코드를 갱신하는 작업을 실행할 것입니다.그 때문에, 레코드의 변경에 수반해 UPSERTing JSON 파일이 필요하게 됩니다.Jenkins에서 실행되고 있기 때문에 이 파일을 보관할 수 있는 로컬 스토리지가 없기 때문에 이 프로젝트가 실행될 때마다(한 시간에 한 번) git 체크 아웃을 할 필요가 없습니다.

데이터를 변수에 저장하는 것이 이상적입니다.$foo)의 일부로서 호출합니다.change-resource-record-setsJenkins 셋업에서는 명령어가 가장 편리합니다만, JSON을 bash에 견적/저장하는 방법은 잘 모릅니다.안전하게 할 수 있을까요?

이 경우의 특정 JSON은 다음과 같습니다.

{"Comment":"Update DNSName.","Changes":[{"Action":"UPSERT","ResourceRecordSet":{"Name":"alex.","Type":"A","AliasTarget":{"HostedZoneId":"######","DNSName":"$bar","EvaluateTargetHealth":false}}}]}

DNSName 값은 복잡성이 더해져 있습니다.$bar- 확장해야 합니다.

여기 doc를 사용할 수 있습니다.

foo=$(cat <<EOF
{"Comment":"Update DNSName.","Changes":[{"Action":"UPSERT","ResourceRecordSet":{"Name":"alex.","Type":"A","AliasTarget":{"HostedZoneId":"######","DNSName":"$bar","EvaluateTargetHealth":false}}}]}
EOF
)

떠나는 것으로EOF따옴표 없이 첫 번째 줄에 here-doc의 내용은 파라미터 확장에 따라 달라집니다.$bar거기에 무엇을 넣든 확장됩니다.

JSON에 줄 바꿈이 있으면 조금 더 읽기 쉽게 만들 수 있습니다.

foo=$(cat <<EOF
{
  "Comment": "Update DNSName.",
  "Changes": [
    {
      "Action": "UPSERT",
      "ResourceRecordSet": {
        "Name": "alex.",
        "Type": "A",
        "AliasTarget": {
          "HostedZoneId": "######",
          "DNSName": "$bar",
          "EvaluateTargetHealth": false
        }
      }
    }
  ]
}
EOF
)

또는 짝수(각 행의 첫 번째 들여쓰기 부분은 탭이어야 함)

foo=$(cat <<-EOF
    {
      "Comment": "Update DNSName.",
      "Changes": [
        {
          "Action": "UPSERT",
          "ResourceRecordSet": {
            "Name": "alex.",
            "Type": "A",
            "AliasTarget": {
              "HostedZoneId": "######",
              "DNSName": "$bar",
              "EvaluateTargetHealth": false
            }
          }
        }
      ]
    }
    EOF
)

그리고 인용을 포함한 저장 방법을 보여준다.bar=baz):

$ declare -p foo
declare -- foo="{
  \"Comment\": \"Update DNSName.\",
  \"Changes\": [
    {
      \"Action\": \"UPSERT\",
      \"ResourceRecordSet\": {
        \"Name\": \"alex.\",
        \"Type\": \"A\",
        \"AliasTarget\": {
          \"HostedZoneId\": \"######\",
          \"DNSName\": \"baz\",
          \"EvaluateTargetHealth\": false
        }
      }
    }
  ]
}"

이로 인해 일부 셸 메타 문자가 확장되므로 JSON에 다음과 같은 기능이 포함되어 있으면 문제가 발생할 수 있습니다.`또는 직접 할당할 수도 있지만 인용에 주의해 주십시오.$bar:

foo='{"Comment":"Update DNSName.","Changes":[{"Action":"UPSERT","ResourceRecordSet":{"Name":"alex.","Type":"A","AliasTarget":{"HostedZoneId":"######","DNSName":"'"$bar"'","EvaluateTargetHealth":false}}}]}'

에 대한 견적에 주의해 주십시오.$bar: 그것은

"'"$bar"'"
│││    │││
│││    ││└ literal double quote
│││    │└ opening syntactical single quote
│││    └ closing syntactical double quote
││└ opening syntactical double quote
│└ closing syntactical single quote
└ literal double quote

파일은 안전하게 저장할 수 있습니다. 생성은 다른 문제입니다. 내용물이$bar부호화가 필요할 수 있습니다.툴이 다음과 같이 되도록 하다jqJSON 작성을 처리합니다.

var=$(jq -n --arg b "$bar" '{
  Comment: "Update DNSName.",
  Changes: [
    {
      Action: "UPSERT",
      ResourceRecordSet: {
        Name: "alex.",
        Type: "A",
        AliasTarget: {
          HostedZoneId: "######",
          DNSName: $b,
          EvaluateTargetHealth: false
        }
      }
    }
  ]
}')

언급URL : https://stackoverflow.com/questions/43373176/store-json-directly-in-bash-script-with-variables

반응형