JSON 字符串中的 Bash 变量替换

JSON 字符串中的 Bash 变量替换

我正在尝试在 BASH 中创建一个 JSON,其中一个字段基于先前命令的结果

BIN=$(cat next_entry)
OUTDIR="/tmp/cpupower/${BIN}"
echo $OUTDIR
JSON="'"'{"hostname": "localhost", "outdir": "${OUTDIR}", "port": 20400, "size": 100000}'"'"
echo $JSON

上面的脚本执行后,返回:

/tmp/cpupower/0
, port: 20400, size: 100000}': /tmp/cpupower/0

如何正确替换这些多引号字符串中的变量?

答案1

JSON=\''{"hostname": "localhost", "outdir": "'"$OUTDIR"'", "port": 20400, "size": 100000}'\'

那就是摆脱单引号的扩展$OUTDIR。为了更好的测量,我们确实将该扩展放在双引号内,尽管对于标量变量赋值来说,这并不是绝对必要的。

当您将$JSON变量传递给echo, 引号时但有必要禁用 split+glob 运算符。最好避免echo任意数据:

printf '%s\n' "$JSON"

答案2

如果您最终尝试使用 AWS 命令​​,@Stéphane Chazelas 的答案几乎有效。在这里,最初的转义引号 (\') 不是必需的,它们实际上破坏了命令。

IP=$(curl ipecho.net/plain ; echo)

aws ec2 authorize-security-group-ingress --group-id sg-**************** \
    --ip-permissions '[{"IpProtocol": "tcp", "FromPort": 15000, "ToPort": 15000, "IpRanges": [{"CidrIp": "'"$IP/32"'", "Description": "Service A"}]}]'

^ 这工作得很好

答案3

Stéphane 的回答很好,得到了好评。这只是一个提示;而不是做

BIN=$(cat next_entry)

你可以做:

BIN=$(<next_entry)

从而节省产生额外的过程。阅读更多这里

答案4

如果我有一个类似于eating.json=的 json 文件{"diner" : {"time" : ""}},我的做法如下:

declare -a NOW
NOW=$(date) 
jq '.diner.time = "'"${NOW}"'"' eating.json > tmp.$$.json && mv tmp.$$.json eating.json

因此,首先,我创建了我的变量,然后,我将我想要的值放入其中,最后,使用jq,我在临时文件中进行了修改(jq我相信模块的特殊性),然后将修改放回eating.json

相关内容