Bash-Variablensubstitution in einer JSON-Zeichenfolge

Bash-Variablensubstitution in einer JSON-Zeichenfolge

Ich versuche, in BASH ein JSON zu erstellen, bei dem eines der Felder auf dem Ergebnis eines früheren Befehls basiert

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

Wenn das obige Skript ausgeführt wird, gibt es Folgendes zurück:

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

Wie kann ich Variablen innerhalb dieser in Anführungszeichen gesetzten Zeichenfolgen richtig ersetzen?

Antwort1

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

Das heißt, wir müssen die einfachen Anführungszeichen für die Erweiterung von entfernen $OUTDIR. Wir haben diese Erweiterung sicherheitshalber in doppelte Anführungszeichen gesetzt, obwohl dies für die Zuweisung einer Skalarvariable nicht unbedingt erforderlich ist.

$JSONWenn Sie die Variable an übergeben echo, AnführungszeichenSindEs ist jedoch notwendig, den Split+Glob-Operator zu deaktivieren. Es ist auch am besten, dies echofür beliebige Daten zu vermeiden:

printf '%s\n' "$JSON"

Antwort2

Wenn Sie hier gelandet sind und versucht haben, AWS-Befehle zu verwenden, funktioniert die Antwort von @Stéphane Chazelas fast. Hier sind die anfänglichen Escape-Anführungszeichen (\') nicht erforderlich, sie unterbrechen den Befehl tatsächlich.

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

^ Das funktioniert prima

Antwort3

Stéphanes Antwort ist großartig und wurde hochgevotet. Hier ist nur ein Tipp: Anstatt

BIN=$(cat next_entry)

Du kannst tun:

BIN=$(<next_entry)

Und so wird das Erstellen eines zusätzlichen Prozesses vermieden. WeiterlesenHier.

Antwort4

Wenn ich eine JSON-Datei habe , die wie folgt aussieht eating.json:{"diner" : {"time" : ""}}

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

Also habe ich zuerst meine Variable erstellt, dann den gewünschten Wert darin eingefügt und schließlich mithilfe von jqdie Änderung in einer temporären Datei vorgenommen (das sind Besonderheiten des jqModuls, glaube ich) und die Änderungen dann wieder in eingefügt eating.json.

verwandte Informationen