我将在序言中说“不,找到一种不同的方式来做到这一点”在这里是可以接受的答案。
是否存在一种可靠的方法来将少量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值- 。
您可以使用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] 删除。
我来说两句