Я пытаюсь создать 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
.