在 cURL 命令中使用环境变量 - Unix

Using Environment Variables in cURL Command - Unix

我的问题很简单。我想在类似于此的 cURL 命令中使用环境变量:

curl -k -X POST -H 'Content-Type: application/json' -d '{"username":"$USERNAME","password":"$PASSWORD"}' 

当我 运行 命令 $USERNAME 作为“$USERNAME”字符串而不是变量的值传递给命令时。有没有办法摆脱这种情况?

谢谢。

单引号禁止变量替换,所以使用双引号。然后必须转义内部双引号。

...  -d "{\"username\":\"$USERNAME\",\"password\":\"$PASSWORD\"}"

为了减少引用,改为从标准输入读取。

curl -k -X POST -H 'Content-Type: application/json' -d @- <<EOF
{ "username": "$USERNAME", "password": "$PASSWORD"}
EOF

-d @foo 从名为 foo 的文件中读取。如果您使用 - 作为文件名,它将从标准输入读取。在这里,标准输入是从 here 文档提供的,它被视为双引号字符串,实际上没有用双引号括起来。

我们的:curl -k -X POST -H 'Content-Type: application/json' -d '{"username":"'"$USERNAME"'","password":"'"$PASSWORD"'"}'

curl -k -X POST -H 'Content-Type: application/json' -d '{"username":"'$USERNAME'","password":"'$PASSWORD'"}'

此处变量位于 "'" 引号之外,并将扩展 shell(就像在 echo $USERNAME 中一样)。例如假设 USRNAME=xxxPASSWORD=yyy 传递给 curl 的 argv[7] 字符串是 {"username":"xxx","password":"yyy"}

是的,当 $USERNAME 或 $PASSWORD 包含 space 个字符时,这将不起作用。

您可以用 "'" 包装环境变量,并且您应该为外部 json 对象保留单引号。

例如

 -d '{"username":"'"$USERNAME"'","password":"'"$PASSWORD"'"}'