Untuk mengurangi kutipan, baca dari input standar saja.
curl -k -X POST -H 'Content-Type: application/json' -d @- <<EOF
{ "username": "$USERNAME", "password": "$PASSWORD"}
EOF
-d @foo
membaca dari file bernama foo
. Jika Anda menggunakan -
sebagai nama file, itu dibaca dari input standar. Di sini, masukan standar diberikan dari dokumen di sini, yang diperlakukan sebagai string dengan tanda kutip ganda tanpa benar-benar menyertakannya dalam tanda kutip ganda.
curl -k -X POST -H 'Content-Type: application/json' -d '{"username":"'$USERNAME'","password":"'$PASSWORD'"}'
Di sini variabel ditempatkan di luar "'"
tanda kutip dan akan diperluas oleh shell (seperti di echo $USERNAME
). Misalnya dengan asumsi bahwa USRNAME=xxx
dan PASSWORD=yyy
string argv[7] diteruskan ke curl
adalah {"username":"xxx","password":"yyy"}
Dan ya, ini tidak akan berfungsi jika $USERNAME atau $PASSWORD berisi karakter spasi.
Tanda kutip tunggal menghambat substitusi variabel, jadi gunakan tanda kutip ganda. Tanda kutip ganda dalam kemudian harus diloloskan.
... -d "{\"username\":\"$USERNAME\",\"password\":\"$PASSWORD\"}"
Sejak jawaban ini ditulis pada tahun 2015, menjadi jelas bahwa teknik ini tidak cukup untuk membuat JSON dengan benar:
$ 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
Masalah kutipan jelas. Solusi (shell) bukan
Praktik terbaik saat ini:gunakan alat khusus JSON untuk membuat 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"}
Dan dengan ikal:
json=$( jq -n -c --arg username "$USERNAME" --arg password "$PASSWORD" '$ARGS.named' )
# or
json=$( jo "username=$USERNAME" "password=$PASSWORD" )
# then
curl ... -d "$json"