Sustitución de variables bash en una cadena JSON

Sustitución de variables bash en una cadena JSON

Estoy intentando crear un JSON en BASH donde uno de los campos se basa en el resultado de un comando anterior.

BIN=$(cat next_entry)
OUTDIR="/tmp/cpupower/${BIN}"
echo $OUTDIR
JSON="'"'{"hostname": "localhost", "outdir": "${OUTDIR}", "port": 20400, "size": 100000}'"'"
echo $JSON

El script anterior, cuando se ejecuta, devuelve:

/tmp/cpupower/0
, port: 20400, size: 100000}': /tmp/cpupower/0

¿Cómo puedo sustituir correctamente variables dentro de estas cadenas entre comillas?

Respuesta1

JSON=\''{"hostname": "localhost", "outdir": "'"$OUTDIR"'", "port": 20400, "size": 100000}'\'

Eso es eliminar las comillas simples para la expansión de $OUTDIR. Pusimos esa expansión entre comillas dobles por si acaso, aunque para una asignación de variable escalar no es estrictamente necesario.

Cuando pasas la $JSONvariable a echocomillassonSin embargo, es necesario desactivar el operador split+glob. También es mejor evitar echodatos arbitrarios:

printf '%s\n' "$JSON"

Respuesta2

Si terminó aquí intentando utilizar los comandos de AWS, la respuesta de @Stéphane Chazelas casi funciona. Aquí, las comillas de escape iniciales (\') no son necesarias, en realidad interrumpen el comando.

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"}]}]'

^ Esto funciona bien

Respuesta3

La respuesta de Stéphane es excelente y recibió un voto positivo. Aquí hay sólo un consejo; en lugar de hacer

BIN=$(cat next_entry)

Tu puedes hacer:

BIN=$(<next_entry)

Y así evitar generar un proceso adicional. Leer másaquí.

Respuesta4

Si tengo un archivo json que dice como eating.json= {"diner" : {"time" : ""}}, la forma en que lo hago es la siguiente:

declare -a NOW
NOW=$(date) 
jq '.diner.time = "'"${NOW}"'"' eating.json > tmp.$$.json && mv tmp.$$.json eating.json

Entonces, primero creé mi variable, luego le puse el valor que quería y, finalmente, usando jq, hice la modificación en un archivo temporal (especificidades del jqmódulo, creo), y luego volví a colocar las modificaciones. eating.json.

información relacionada