我要前言说“不,找到一种不同的方式去做"这是一个可以接受的答案。
是否有一种可靠的方法可以在bash变量中存储一小段JSON,以便在从同一脚本运行的AWS CLI命令中使用?
我将从Jenkins运行一个更新AWS Route53记录的工作,该记录需要UPSERT一个带有记录更改的JSON文件。因为它是从Jenkins运行的,所以我没有本地存储空间来保存这个文件,我真的很想避免每次运行这个项目时都需要进行git checkout(这将是每小时一次)。
理想情况下,将数据存储在变量($foo
)中并将其作为change-resource-record-sets
命令的一部分进行调用将是最方便的,因为Jenkins设置,但我不熟悉如何在bash中引用/存储JSON - 可以安全地完成吗?
在这种情况下,具体的JSON如下;
{"Comment":"Update DNSName.","Changes":[{"Action":"UPSERT","ResourceRecordSet":{"Name":"alex.","Type":"A","AliasTarget":{"HostedZoneId":"######","DNSName":"$bar","EvaluateTargetHealth":false}}}]}
作为一个额外的复杂因素,需要扩展DNSName值 - $bar
。
答案 0 :(得分:32)
您可以使用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": "baz",
"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
}
}
}
]
}"
因为这会扩展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
答案 1 :(得分:9)
可以安全存储; 生成它是另一回事,因为$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
}
}
}
]
}')