Para citar menos, lea desde la entrada estándar.
curl -k -X POST -H 'Content-Type: application/json' -d @- <<EOF
{ "username": "$USERNAME", "password": "$PASSWORD"}
EOF
-d @foo
lee de un archivo llamado foo
. Si usa -
como nombre de archivo, se lee desde la entrada estándar. Aquí, la entrada estándar se proporciona desde un documento aquí, que se trata como una cadena entre comillas dobles sin encerrarla realmente entre comillas dobles.
curl -k -X POST -H 'Content-Type: application/json' -d '{"username":"'$USERNAME'","password":"'$PASSWORD'"}'
Aquí la variable se coloca fuera de "'"
comillas y se expandirá por shell (al igual que en echo $USERNAME
). Por ejemplo, suponiendo que USRNAME=xxx
y PASSWORD=yyy
la cadena argv[7] pasada a curl
es {"username":"xxx","password":"yyy"}
Y sí, esto no funcionará cuando $USERNAME o $PASSWORD contengan espacios.
Las comillas simples inhiben la sustitución de variables, así que use comillas dobles. Las comillas dobles internas deben escaparse.
... -d "{\"username\":\"$USERNAME\",\"password\":\"$PASSWORD\"}"
Dado que esta respuesta se escribió en 2015, ha quedado claro que esta técnica es insuficiente para crear correctamente 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
El problema de cotización es claro. Las soluciones (shell) no son
Práctica recomendada actual:utilice una herramienta específica de JSON para crear JSON:
-
jq
$ jq -n -c --arg username "$USERNAME" --arg password "$PASSWORD" '$ARGS.named' {"username":"person1","password":"some \"gnarly 'password"}
-
yo
$ jo "username=$USERNAME" "password=$PASSWORD" {"username":"person1","password":"some \"gnarly 'password"}
Y con rizo:
json=$( jq -n -c --arg username "$USERNAME" --arg password "$PASSWORD" '$ARGS.named' )
# or
json=$( jo "username=$USERNAME" "password=$PASSWORD" )
# then
curl ... -d "$json"