Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将JSON直接存储在带有变量的bash脚本中?_Json_Bash - Fatal编程技术网

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

将JSON直接存储在带有变量的bash脚本中?,json,bash,Json,Bash,我会在序言中说“不,找一个不同的方法来做”是一个可以接受的答案 是否有可靠的方法在bash变量中存储一小段JSON,以用于从同一脚本运行的AWS CLI命令 我将运行Jenkins的一个作业,该作业正在更新AWS Route53记录,这需要使用记录中的更改更新JSON文件。因为它是从Jenkins运行的,所以我没有本地存储来保存这个文件,我真的希望避免每次项目运行时(每小时一次)都需要进行git签出 理想情况下,在Jenkins设置下,将数据存储在变量($foo)中并将其作为更改资源记录集命令的

我会在序言中说“不,找一个不同的方法来做”是一个可以接受的答案

是否有可靠的方法在bash变量中存储一小段JSON,以用于从同一脚本运行的AWS CLI命令

我将运行Jenkins的一个作业,该作业正在更新AWS Route53记录,这需要使用记录中的更改更新JSON文件。因为它是从Jenkins运行的,所以我没有本地存储来保存这个文件,我真的希望避免每次项目运行时(每小时一次)都需要进行git签出

理想情况下,在Jenkins设置下,将数据存储在变量(
$foo
)中并将其作为
更改资源记录集
命令的一部分调用将是最方便的,但我不知道如何在bash中引用/存储JSON,这样做安全吗

本例中的具体JSON如下所示:

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

作为额外的复杂性,需要扩展DNSName值-
$bar

您可以在此处使用文档:

foo=$(cat <<EOF
{"Comment":"Update DNSName.","Changes":[{"Action":"UPSERT","ResourceRecordSet":{"Name":"alex.","Type":"A","AliasTarget":{"HostedZoneId":"######","DNSName":"$bar","EvaluateTargetHealth":false}}}]}
EOF
)
甚至(每行的第一个缩进必须是制表符)

因为这会扩展一些shell元字符,所以如果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
的内容进行编码。让
jq
这样的工具来处理JSON的创建

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

jq绝对是一个选项,因为我们在其他地方使用它,但我想知道的是缺少引号-jq是否能够处理在所有东西周围加引号的问题,或者这只是您在示例中遗漏的东西?AWS似乎需要带引号的密钥对。@Alex
jq
允许过滤器中的密钥不带引号,如果它只是字母数字键;生成的JSON将带有引号。这是一个解决方案,因为
jq
检查JSON,以便能够捕获最终的错误,并确保生成的JSON始终正确。(又名:使用正确的工具解决问题):
n
from
manjq
:根本不读取任何输入!相反,使用null作为输入运行一次过滤器。当使用jq作为简单计算器或从头构造JSON数据时,这非常有用。--在我看来,似乎没有添加进一步的数据,只是一次json创建。您没有引用
$var
,因此它需要进行分词。只有第一个空格前面的
$var
部分用作
-d
的参数;下一位被视为主机名,而不是
localhost
。这非常有效,尤其感谢bar的报价细分,解决了未来的问题!这不仅是我想要的解决方案,而且是确切的用例。感谢关闭语法单引号,并反过来打开语法单引号?@Timo否,它们的标签正确:内部的
“$bar”
位于单引号字符串的外部,因此第一个
关闭一个单引号字符串,第二个
打开一个新字符串。
foo='{"Comment":"Update DNSName.","Changes":[{"Action":"UPSERT","ResourceRecordSet":{"Name":"alex.","Type":"A","AliasTarget":{"HostedZoneId":"######","DNSName":"'"$bar"'","EvaluateTargetHealth":false}}}]}'
"'"$bar"'"
│││    │││
│││    ││└ literal double quote
│││    │└ opening syntactical single quote
│││    └ closing syntactical double quote
││└ opening syntactical double quote
│└ closing syntactical single quote
└ literal double quote
var=$(jq -n --arg b "$bar" '{
  Comment: "Update DNSName.",
  Changes: [
    {
      Action: "UPSERT",
      ResourceRecordSet: {
        Name: "alex.",
        Type: "A",
        AliasTarget: {
          HostedZoneId: "######",
          DNSName: $b,
          EvaluateTargetHealth: false
        }
      }
    }
  ]
}')