我正在尝试在 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
。