Pro méně citací čtěte místo toho ze standardního vstupu.
curl -k -X POST -H 'Content-Type: application/json' -d @- <<EOF
{ "username": "$USERNAME", "password": "$PASSWORD"}
EOF
-d @foo
čte ze souboru s názvem foo
. Pokud použijete -
jako název souboru se čte ze standardního vstupu. Zde je standardní vstup dodáván z dokumentu here, který je považován za řetězec s dvojitými uvozovkami, aniž by byl ve skutečnosti uzavřen do dvojitých uvozovek.
curl -k -X POST -H 'Content-Type: application/json' -d '{"username":"'$USERNAME'","password":"'$PASSWORD'"}'
Zde jsou proměnné umístěny mimo "'"
uvozovek a bude rozšířen o shell (stejně jako v echo $USERNAME
). Například za předpokladu, že USRNAME=xxx
a PASSWORD=yyy
řetězec argv[7] předán do curl
je {"username":"xxx","password":"yyy"}
A ano, toto nebude fungovat, když $USERNAME nebo $PASSWORD obsahují mezery.
Jednoduché uvozovky brání nahrazování proměnné, proto používejte dvojité uvozovky. Vnitřní dvojité uvozovky pak musí být escapovány.
... -d "{\"username\":\"$USERNAME\",\"password\":\"$PASSWORD\"}"
Od té doby, co byla tato odpověď napsána v roce 2015, se ukázalo, že tato technika nestačí ke správnému vytvoření JSON:
$ 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
Problém s citací je jasný. Řešení (shell) nejsou
Aktuální osvědčený postup:použijte k vytvoření JSON nástroj specifický pro JSON:
-
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"}
A s curl:
json=$( jq -n -c --arg username "$USERNAME" --arg password "$PASSWORD" '$ARGS.named' )
# or
json=$( jo "username=$USERNAME" "password=$PASSWORD" )
# then
curl ... -d "$json"