含空格变量的Curl POST请求JSON错误及主机解析失败问题求助
这个问题我之前也踩过坑,本质是**shell的单词拆分(word splitting)**在搞鬼!当你的MACMODEL变量里包含空格、括号这类特殊字符时,直接用'{ "model":"'$MACMODEL'" }'这种写法会被shell拆成多个独立的“单词”,curl把这些拆分后的内容当成了额外的URL参数,所以才会出现“无法解析主机Pro”这类错误,同时JSON结构也被拆坏,服务器自然返回400错误。
下面给你几个靠谱的解决方案,按推荐程度排序:
方法1:用jq生成合法JSON(最推荐)
jq是专门处理JSON的工具,能自动帮你处理字符串转义,完全不用手动操心特殊字符的问题。先确保你安装了jq(macOS用brew install jq,Linux用apt install jq或对应系统的包管理器),然后修改命令:
MACMODEL='MacBook Pro (Retina, 13-inch, Early 2015)' curl --request POST \ --header 'Authorization2: token' \ --header "Content-Type: application/json" \ --data "$(jq -n --arg model "$MACMODEL" '{model: $model}')" \ https://endpoint ; echo
这里jq -n --arg model "$MACMODEL" '{model: $model}'会生成完全符合标准的JSON字符串,--arg参数安全地把变量传递给jq,不管变量里有空格还是特殊字符都能正确处理。
方法2:手动正确包裹引号
如果你不想额外安装工具,可以调整引号的写法,让shell正确识别整个JSON字符串:
MACMODEL='MacBook Pro (Retina, 13-inch, Early 2015)' curl --request POST \ --header 'Authorization2: token' \ --header "Content-Type: application/json" \ --data "{ \"model\": \"$MACMODEL\" }" \ https://endpoint ; echo
要点是:把整个--data的参数用双引号包裹,里面的JSON内部双引号要加反斜杠转义(\"),这样shell会完整展开$MACMODEL的值,不会把空格当成分隔符。
方法3:用Here-Document传递数据
还有一种更直观的方式,用curl的--data @-从标准输入读取JSON,配合here-document:
MACMODEL='MacBook Pro (Retina, 13-inch, Early 2015)' curl --request POST \ --header 'Authorization2: token' \ --header "Content-Type: application/json" \ --data @- https://endpoint <<EOF {"model": "$MACMODEL"} EOF
<<EOF到EOF之间的内容会被当成完整的输入传递给curl,shell会正确展开变量,同时保留所有空格和特殊字符,写法也很清晰。
随便选一种方法试一下,都能解决你遇到的问题~
内容的提问来源于stack exchange,提问作者Pichingo

