将JSON直接存储在带有变量的bash脚本中?

亚历克斯

我将在序言中说“不,找到一种不同的方式来做到这一点”在这里是可以接受的答案。

是否存在一种可靠的方法来将少量JSON存储在bash变量中,以便在从同一脚本运行的AWS CLI命令中使用?

我将在詹金斯(Jenkins)上运行一项工作,该工作正在更新AWS Route53记录,这需要使用记录中的更改进行UPSERTing JSON文件。因为它是从Jenkins运行的,所以没有可以保存此文件的本地存储,并且我非常想避免每次该项目运行时(一个小时一次)都需要进行git checkout。

理想情况下,考虑到Jenkins的设置,将数据存储在变量($foo)中并作为change-resource-record-sets命令的一部分进行调用将是最方便的,但是我不完全了解如何在bash中引用/存储JSON-可以安全地做到这一点吗?

在这种情况下,特定的JSON如下:

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

更为复杂的是$bar,需要扩展DNSName值-

本杰明W.

您可以使用here-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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

我想将Bash脚本的所有命令行参数存储到单个变量中

将Python脚本的返回值存储在bash脚本中

在bash脚本中运行带有参数的python命令时的变量表示法

如何将bash脚本直接嵌入Mercurial别名中

Bash脚本将cat输出存储在变量中,然后将其回显

将awk结果存储在bash脚本中的变量中

将Json引用为$ arg bash,有效负载中带有变量(arg1 arg2未传递变量)

将带有SubTree的JSON存储到PHP变量中

BASH脚本-将数值存储在变量中,然后进行比较

如何将所有环境变量导出到JSON并将其存储在Bash中的变量中?

Bash脚本-将`curl`输出存储在变量中,然后根据变量中的字符串进行格式化

如何使用bash脚本语言将数组长度存储在变量中

将grive命令输出存储到bash脚本中的变量

将文本输出存储在变量中(bash)

bash脚本将''添加到带有curl的变量中

Bash脚本将文件中的单词存储在不同的变量中

如何从带有bash变量的shell脚本中运行MYSQL脚本?

bash脚本中带有变量的awk模式

名称中带有变量的bash数组

带有变量的bash调用脚本

如何从带有混合变量/字符串文字参数的Bash脚本中mkdir或cp?

在java脚本中从json获取键的值(将键名存储在变量中并使用它)

bash 将变量值存储到 JSON 文件中

将脚本执行输出存储在 bash 变量中

如何对目录中带有 json 扩展名的所有文件运行 bash 脚本?

带有空格的变量作为 Bash 脚本中的参数传递

有没有办法将标准输出从 bash 脚本存储到 GO 中的变量中?

将脚本名称存储在变量中

bash 脚本 - 将命令的多个输出存储在单独的变量中