Подстановка переменной Bash в строку JSON

Подстановка переменной Bash в строку JSON

Я пытаюсь создать JSON в BASH, где одно из полей основано на результате предыдущей команды.

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

Ответ Стефана отличный, и он получил положительные отзывы. Вот вам совет: вместо того, чтобы делать

BIN=$(cat next_entry)

Ты можешь сделать:

BIN=$(<next_entry)

И таким образом избежите создания дополнительного процесса. Читать далее.здесь.

решение4

Если у меня есть файл json, который выглядит как eating.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.

Связанный контент