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 $JSON
variable a echo
comillassonSin embargo, es necesario desactivar el operador split+glob. También es mejor evitar echo
datos 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 jq
módulo, creo), y luego volví a colocar las modificaciones. eating.json
.