Deaktivieren Sie Bash Quoting mit JSON

1

Ich habe vorher ähnliche Fragen angeschaut, aber mein Problem nicht genau beantwortet.

Ich verwende cURL, um eine JSON-Anfrage wie folgt zu senden:

curl -X POST  -H "Content-Type:application/json" "$HOST" -d '{"uri": "'"$URI"'", "identityKeyValue":"'"`date +%s`"'", "identityKeyType": "bar", "status": "'$STATUS'", "statusDetail": "'"$STATUS_DETAIL"'", "exclusionKeys": [], "monitoredEntity": {"name": "foobar"}, "timestamp":'"`date +%s`"', "metadata": {} }'

Es funktioniert, aber es ist sehr hässlich (ich spreche über den Teil danach -d), aber ich konnte nichts Besseres finden, das den folgenden Anforderungen entspricht:

  1. Unterstützt Variablensubstitution (like $STATUS)
  2. Unterstützung befehl ersetzung (like `date +%s`)

Da es sich um JSON handelt, werden offensichtlich viele doppelte Anführungszeichen benötigt ( ")

Der Befehl muss nicht aus einer Zeile bestehen. Ich möchte eher Lesbarkeit und Klarheit als diesen chaotischen / hackigen Look. Was schlagen Sie vor?

kolistivra
quelle

Antworten:

1

Teilen Sie es in mehrere Schritte auf und verwenden Sie eine printfVorlage:

fmt='{"uri": "%s", "identityKeyValue":"%s", "identityKeyType": "bar", "status": "%s", "statusDetail": "%s", "exclusionKeys": [], "monitoredEntity": {"name": "foobar"}, "timestamp":%d, "metadata": {}}'
time=$(date +%s)
data=$(printf "$fmt" "$URI" $time "$STATUS" "$STATUS_DETAIL" $time)
curl -X POST  -H "Content-Type:application/json" "$HOST" -d "$data"

Machen Sie es sich auch nicht mehr zur Gewohnheit, ALL_CAPS_VARNAMES zu verwenden: Eines Tages verwenden Sie versehentlich PATH und fragen sich, warum Ihr Programm nicht mehr funktioniert.

Glenn Jackman
quelle