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

相關內容