我将在开头说“不,找到一种不同的方式来做这件事”是一个可以接受的答案。
是否存在一种可靠的方法来将少量JSON存储在bash变量中,以便在从同一脚本运行的AWS CLI命令中使用?
我将在Jenkins上运行一项工作,该工作正在更新AWS Route53记录,这需要使用记录中的更改进行UPSERTing JSON文件。因为它是从Jenkins运行的,所以没有本地存储可以保存此文件,因此我非常想避免每次运行此项目时(每个小时运行一次)需要进行git checkout。
理想情况下,考虑到Jenkins的设置,将数据存储在变量($foo)中并作为change-resource-record- sets命令的一部分进行调用将是最方便的,但是我不熟悉如何在bash中引用/存储JSON-可以安全地做到这一点吗?
$foo
change-resource-record- sets
在这种情况下,特定的JSON如下:
{"Comment":"Update DNSName.","Changes":[{"Action":"UPSERT","ResourceRecordSet":{"Name":"alex.","Type":"A","AliasTarget":{"HostedZoneId":"######","DNSName":"$bar","EvaluateTargetHealth":false}}}]}
更为复杂的是$bar,需要扩展DNSName值- 。
$bar
您可以使用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扩展内容将扩展为您在其中输入的内容。
EOF
如果您可以在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):
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`:
``所以如果您的JSON包含类似的内容,您可能会遇到麻烦,因此,您可以直接分配,但要谨慎引用
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