json=';{\";键\";:\";值\";}&&x27;在bash中,服务器使用curl-d$json拒绝了它

json=';{\";键\";:\";值\";}&&x27;在bash中,服务器使用curl-d$json拒绝了它,json,bash,curl,Json,Bash,Curl,我提供了一个定期调用的bash脚本片段。我似乎无法获取必须提交才能正确转义的JSON(web服务器表示缺少必填字段): 错误消息: {"id":"04723a42-c2b4-4181-839d-a8ca5180434b","type":"error","links":{},"actions":{},"status":422,"code":"MissingRequired","message":null,"detail":null,"fieldName":"rollingRestartStrate

我提供了一个定期调用的bash脚本片段。我似乎无法获取必须提交才能正确转义的JSON(web服务器表示缺少必填字段):

错误消息:

{"id":"04723a42-c2b4-4181-839d-a8ca5180434b","type":"error","links":{},"actions":{},"status":422,"code":"MissingRequired","message":null,"detail":null,"fieldName":"rollingRestartStrategy","baseType":"error"}
修复赋值(作为文字数据) 双引号已经包含在单引号中。您不需要使用反斜杠来进一步转义它们(也不能,因为在单引号中,这些反斜杠也是文字的——也就是说,解析为数据而不是语法)

修复赋值(如果传递Shell变量) 比方说,您实际上希望使用shell变量来设置策略,而不是文字值。在这种情况下,最佳做法是使用
jq

strategy="whatever"
json=$(jq -cn --arg strategy "$strategy" '{ "rollingRestartStrategy": $strategy }')
这将为每一种可能的
策略生成格式良好的JSON
——甚至是包含文字引号、文字换行符或其他奇怪的值

修正用法 总是,总是引用扩展(除非在特别不需要它的场景中——例如赋值,即使在未引用的情况下也不受扩展时间字符串拆分和全局扩展的影响)。请注意,使用
$()
替换命令会创建一个新的引用上下文,因此命令替换中使用的引号不会与命令替换外部使用的引号交互

output=$(curl -u "${CATTLE_ACCESS_KEY}:${CATTLE_SECRET_KEY}" \
              -X POST \
              -H 'Accept: application/json' \
              -d "$json" \
              "$url")
修复赋值(作为文字数据) 双引号已经包含在单引号中。您不需要使用反斜杠来进一步转义它们(也不能,因为在单引号中,这些反斜杠也是文字的——也就是说,解析为数据而不是语法)

修复赋值(如果传递Shell变量) 比方说,您实际上希望使用shell变量来设置策略,而不是文字值。在这种情况下,最佳做法是使用
jq

strategy="whatever"
json=$(jq -cn --arg strategy "$strategy" '{ "rollingRestartStrategy": $strategy }')
这将为每一种可能的
策略生成格式良好的JSON
——甚至是包含文字引号、文字换行符或其他奇怪的值

修正用法 总是,总是引用扩展(除非在特别不需要它的场景中——例如赋值,即使在未引用的情况下也不受扩展时间字符串拆分和全局扩展的影响)。请注意,使用
$()
替换命令会创建一个新的引用上下文,因此命令替换中使用的引号不会与命令替换外部使用的引号交互

output=$(curl -u "${CATTLE_ACCESS_KEY}:${CATTLE_SECRET_KEY}" \
              -X POST \
              -H 'Accept: application/json' \
              -d "$json" \
              "$url")

运行
echo“$json”
,问题就显而易见了……嗯,问题之一。对其他部分运行代码。而
output=$(echo“$request\u cmd”)
没有任何有用的功能;您可以只调用变量
output=$(curl…
,而不是首先分配
request\u cmd
(…除此之外,
var2=$(echo“$var1”)
引入了
var2=$var1
不会出现的错误;如果
var1='-n'
或包含文字反斜杠,并且在不同的实现中有所不同)。运行
echo“$json”
,问题就显而易见了……好吧,问题之一。对其他部分运行代码。而
output=$(echo“$request\u cmd”)
没有任何有用的功能;您可以只调用变量
output=$(curl…
,而不是首先分配
request\u cmd
(…除此之外,
var2=$(echo“$var1”)
引入了
var2=$var1
不会出现的错误;如果
var1='-n'
或包含文字反斜杠,并且在不同的实现中有所不同)。