Wie entkomme ich mit Bash einem Semikolon in einer Zeichenfolge?

Wie entkomme ich mit Bash einem Semikolon in einer Zeichenfolge?

Ich habe die folgende JSON-Zeichenfolge, die ich verwende, um den aws route53 change-resource-record-setsBefehl 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 $JSONeingab, 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 jqBefehl wird hier verwendet, um die Werte der beiden Shell-Variablen domainund domainNamein ein Inline-JSON-Dokument einzufügen. Die beiden Variablen werden in der Befehlszeile verwendet, um zwei interne jqVariablen $domainbzw. 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.

verwandte Informationen