Json对象无法在bash中正确转义

时间:2019-03-15 12:34:28

标签: bash

这是我的剧本

#!/bin/bash
set -x
USERNAME="someUser"
curl -H "Content-Type: application/json" -X POST -d '{"auth":{ "client": $USERNAME, "password": "somePassword" }, "messages": { "UpdateProduct": {} }}' http://someDomain.com/services/json

它变成如下,它没有将$USERNAME替换为someUser

curl -H "Content-Type: application/json" -X POST -d '{"auth":{ "client": $USERNAME, "password": "somePassword" }, "messages": { "UpdateProduct": {} }}' http://someDomain.com/services/json

但是如果我放入USERNAME,它就可以工作

curl -H "Content-Type: application/json" -X POST -d '{"auth":{ "client": "someUser", "password": "somePassword" }, "messages": { "UpdateProduct": {} }}' http://someDomain.com/services/json

1 个答案:

答案 0 :(得分:2)

单引号不会扩展变量。您可以使用

之类的东西
 -d '{"auth":{ "client": '"$USERNAME"', "password"...

,但是如果用户名包含双引号,它仍然会中断。

最干净的方法是使用了解JSON的工具,例如jq

$ USERNAME='"a"' jq '.username|=env.USERNAME' <<< '{"username":"..."}'
{
  "username": "\"a\""
}