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.
$JSON
Wenn Sie die Variable an übergeben echo
, AnführungszeichenSindEs ist jedoch notwendig, den Split+Glob-Operator zu deaktivieren. Es ist auch am besten, dies echo
fü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 jq
die Änderung in einer temporären Datei vorgenommen (das sind Besonderheiten des jq
Moduls, glaube ich) und die Änderungen dann wieder in eingefügt eating.json
.