Wenn Sie weniger zitieren möchten, lesen Sie stattdessen von der Standardeingabe.
curl -k -X POST -H 'Content-Type: application/json' -d @- <<EOF
{ "username": "$USERNAME", "password": "$PASSWORD"}
EOF
-d @foo
liest aus einer Datei namens foo
. Wenn Sie -
verwenden als Dateiname wird von der Standardeingabe gelesen. Hier wird die Standardeingabe aus einem Here-Dokument geliefert, das als Zeichenfolge in doppelten Anführungszeichen behandelt wird, ohne sie tatsächlich in doppelte Anführungszeichen zu setzen.
curl -k -X POST -H 'Content-Type: application/json' -d '{"username":"'$USERNAME'","password":"'$PASSWORD'"}'
Hier werden die Variablen außerhalb von "'"
platziert Anführungszeichen und werden durch die Shell erweitert (genau wie in echo $USERNAME
). Nehmen wir zum Beispiel an, dass USRNAME=xxx
und PASSWORD=yyy
die Zeichenfolge argv[7] wird an curl
übergeben ist {"username":"xxx","password":"yyy"}
Und ja, das funktioniert nicht, wenn $USERNAME oder $PASSWORD Leerzeichen enthalten.
Einfache Anführungszeichen verhindern die Ersetzung von Variablen, verwenden Sie also doppelte Anführungszeichen. Die inneren doppelten Anführungszeichen müssen dann maskiert werden.
... -d "{\"username\":\"$USERNAME\",\"password\":\"$PASSWORD\"}"
Seit diese Antwort im Jahr 2015 geschrieben wurde, ist klar geworden, dass diese Technik nicht ausreicht, um JSON richtig zu erstellen:
$ USERNAME=person1
$ PASSWORD="some \"gnarly 'password"
$ echo "{\"username\":\"$USERNAME\",\"password\":\"$PASSWORD\"}"
{"username":"person1","password":"some "gnarly 'password"}
$ echo "{\"username\":\"$USERNAME\",\"password\":\"$PASSWORD\"}" | jq .
parse error: Invalid numeric literal at line 1, column 47
Das Zitierproblem ist klar. Die (Shell-)Lösungen sind es nicht
Aktuelle Best Practice:Verwenden Sie ein JSON-spezifisches Tool, um JSON zu erstellen:
-
jq
$ jq -n -c --arg username "$USERNAME" --arg password "$PASSWORD" '$ARGS.named' {"username":"person1","password":"some \"gnarly 'password"}
-
jo
$ jo "username=$USERNAME" "password=$PASSWORD" {"username":"person1","password":"some \"gnarly 'password"}
Und mit curl:
json=$( jq -n -c --arg username "$USERNAME" --arg password "$PASSWORD" '$ARGS.named' )
# or
json=$( jo "username=$USERNAME" "password=$PASSWORD" )
# then
curl ... -d "$json"