
Ich habe die folgende JSON-Zeichenfolge, die ich verwende, um den aws route53 change-resource-record-sets
Befehl zum Aktualisieren eines aktuellen DMARC-Eintrags zu füttern. Wie Sie sehen, enthält der TXT-Wert ;
.
JSON="{ \"Comment\": \"Updating TXT record in $domain\",
\"Changes\": [ { \"Action\": \"UPSERT\", \"ResourceRecordSet\": { \"Name\":
\"_dmarc.${domainName}\", \"Type\": \"TXT\", \"TTL\":
3600, \"ResourceRecords\": [ { \"Value\": "\"v=DMARC1\; p=reject\; pct=100\"" } ] } } ] }"
Als ich echo $JSON
eingab, erhielt ich statt des gesamten JSON-Strings die folgende Ausgabe. Es scheint, dass die Analyse stoppt, sobald sie auf traf ;
.
{ "Comment": "Updating TXT record in ",
"Changes": [ { "Action": "UPSERT", "ResourceRecordSet": { "Name":
"_dmarc.contoso.com", "Type": "TXT", "TTL":
3600, "ResourceRecords": [ { "Value": "v=DMARC1;
Ich habe verschiedene Möglichkeiten ausprobiert, das Semikolon zu umgehen, z. B. mit und \\;
, aber \";\"
ohne Erfolg. Was habe ich hier falsch gemacht?
Antwort1
Verwenden Sie einfach eine Mischung aus einfachen und doppelten Anführungszeichen, dann sieht es nicht so chaotisch aus und es lässt sich leichter damit arbeiten:
JSON='{ "Comment": "Updating TXT record in $domain",
"Changes": [ { "Action": "UPSERT", "ResourceRecordSet": { "Name":
"_dmarc.${domainName}", "Type": "TXT", "TTL":
3600, "ResourceRecords": [ { "Value": "v=DMARC1; p=reject; pct=100" } ] } } ] }'
Das hier funktioniert. Beispiel:
$ JSON='{ "Comment": "Updating TXT record in $domain",
"Changes": [ { "Action": "UPSERT", "ResourceRecordSet": { "Name":
"_dmarc.${domainName}", "Type": "TXT", "TTL":
3600, "ResourceRecords": [ { "Value": "v=DMARC1; p=reject; pct=100" } ] } } ] }'
$
$ echo $JSON | jq .
{
"Comment": "Updating TXT record in $domain",
"Changes": [
{
"Action": "UPSERT",
"ResourceRecordSet": {
"Name": "_dmarc.${domainName}",
"Type": "TXT",
"TTL": 3600,
"ResourceRecords": [
{
"Value": "v=DMARC1; p=reject; pct=100"
}
]
}
}
]
}
$
Antwort2
Es stellte sich heraus, dass das Problem hier nicht darin besteht, die Semikolons zu maskieren, sondern das Leerzeichen nach dem Semikolon. Nachdem ich die Zeichenfolge in etwa wie folgt geändert hatte
{ \"Value\": "\"v=DMARC1\;\ p=reject\;\ pct=100\"" }
Die Zeichenfolge wird jetzt ordnungsgemäß wiedergegeben!
{ "Value": "v=DMARC1; p=reject; pct=100" }
Antwort3
Ihnen fehlen Escapes für einige Anführungszeichen und Backslashs am Ende. Die Anführungszeichen wären einfacher zu handhaben, wenn Sie die JSON-Dokumentzeichenfolge in einfache Anführungszeichen setzen würden.
Es scheint, als ob Sie Werte aus Shell-Variablen in ein JSON-Dokument einfügen möchten. Am sichersten geht das mit jq
:
$ domain=my.domain.example.com
$ domainName=some-domain-name
$ JSON=$( jq -c -n --arg domain "$domain" --arg name "$domainName" '
{ "Comment": "Updating TXT record in \($domain)",
"Changes": [ {
"Action": "UPSERT",
"ResourceRecordSet": {
"Name": "_dmarc.\($name)", "Type": "TXT", "TTL": 3600,
"ResourceRecords": [ { "Value": "\"v=DMARC1; p=reject; pct=100\"" } ]
} } ] }' )
Der jq
Befehl wird hier verwendet, um die Werte der beiden Shell-Variablen domain
und domainName
in ein Inline-JSON-Dokument einzufügen. Die beiden Variablen werden in der Befehlszeile verwendet, um zwei interne jq
Variablen $domain
bzw. zu initialisieren $name
. Diese werden vom JSON-Dokument in den Zeichenfolgen referenziert, in die sie eingefügt werden sollen.
Auf diese Weise wird sichergestellt, dass alle Zeichen, die eine spezielle Escape-Sequenz benötigen, für die Aufnahme in die JSON-Zeichenfolgen im Dokument ordnungsgemäß escaped werden.
Beachten Sie, dass ich die eingebetteten Anführungszeichen in dieser Zeichenfolge am Ende gelassen habe, da ich nicht weiß, ob sie erforderlich sind oder nicht. Ein JSON-Parser würde die maskierten Anführungszeichen beim Lesen der Daten ordnungsgemäß dekodieren.