我正在嘗試在 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
。