如何使用 Bash 轉義字串中的分號

如何使用 Bash 轉義字串中的分號

我得到了下面的 JSON 字串,我用它來提供aws route53 change-resource-record-sets命令以更新當前的 DMARC 記錄。如您所見,TXT 值包含;.

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得到以下輸出而不是整個 JSON 字串時。看來解析一命中就停止了;

{ "Comment": "Updating TXT record in ", 
  "Changes": [ { "Action": "UPSERT", "ResourceRecordSet": { "Name": 
  "_dmarc.contoso.com", "Type": "TXT", "TTL": 
  3600, "ResourceRecords": [ { "Value": "v=DMARC1;

我嘗試了多種方法來逃避分號,例如使用\\;and ,\";\"但運氣不佳。我在這裡做錯了什麼?

答案1

只需混合使用單引號和雙引號,就不會看起來那麼混亂並且更容易使用:

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

這個有效。例子:

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

答案2

事實證明,這裡的問題不是轉義分號,而是轉義分號後面的空格。當我把字串改成這樣之後

{ \"Value\": "\"v=DMARC1\;\ p=reject\;\ pct=100\"" }

該字串現在已正確回顯!

{ "Value": "v=DMARC1; p=reject; pct=100" }

答案3

最後的一些引號和反斜線缺少轉義符。如果在 JSON 文件字串周圍使用單引號,管理引用會更容易。

似乎您想將 shell 變數中的值插入 JSON 文件中。你這樣做最安全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\"" } ]
      } } ] }' )

此處使用該jq指令將兩個 shell 變數的值插入domain內嵌domainNameJSON 文件中。這兩個變數在命令列上使用,分別初始化兩個內部jq變數$domain$name。這些由 JSON 文件引用,在它們應該插入的字串中。

這樣做可以確保任何需要特殊轉義的字元都被正確轉義以包含到文件中的 JSON 字串中。

請注意,我在該字串的末尾留下了嵌入的雙引號,因為我不知道它們是否是必需的。 JSON 解析器在讀取資料時會正確解碼轉義的引號。

相關內容