引用を少なくするには、代わりに標準入力から読み取ります。
curl -k -X POST -H 'Content-Type: application/json' -d @- <<EOF
{ "username": "$USERNAME", "password": "$PASSWORD"}
EOF
-d @foo
foo
という名前のファイルから読み取ります . -
を使用する場合 ファイル名として、標準入力から読み取ります。ここでは、標準入力はヒア ドキュメントから提供されます。ヒア ドキュメントは、実際には二重引用符で囲まれることなく、二重引用符で囲まれた文字列として扱われます。
curl -k -X POST -H 'Content-Type: application/json' -d '{"username":"'$USERNAME'","password":"'$PASSWORD'"}'
ここで、変数は "'"
の外側に配置されます 引用符で囲まれ、シェルによって展開されます (echo $USERNAME
のように) )。たとえば、 USRNAME=xxx
と仮定すると と PASSWORD=yyy
curl
に渡された argv[7] 文字列 {"username":"xxx","password":"yyy"}
です
はい、$USERNAME または $PASSWORD に空白文字が含まれている場合、これは機能しません。
単一引用符は変数の置換を禁止するため、二重引用符を使用してください。内側の二重引用符はエスケープする必要があります。
... -d "{\"username\":\"$USERNAME\",\"password\":\"$PASSWORD\"}"
この回答は 2015 年に書かれて以来、この手法では 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
引用の問題は明らかです。 (シェル) ソリューションはそうではありません
現在のベスト プラクティス:JSON 固有のツールを使用して JSON を作成する:
-
jq
$ jq -n -c --arg username "$USERNAME" --arg password "$PASSWORD" '$ARGS.named' {"username":"person1","password":"some \"gnarly 'password"}
-
じょ
$ jo "username=$USERNAME" "password=$PASSWORD" {"username":"person1","password":"some \"gnarly 'password"}
curl の場合:
json=$( jq -n -c --arg username "$USERNAME" --arg password "$PASSWORD" '$ARGS.named' )
# or
json=$( jo "username=$USERNAME" "password=$PASSWORD" )
# then
curl ... -d "$json"