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