执行Bash脚本调用curl时出现URL格式错误问题求助
问题:curl请求格式错误排查与修复
错误信息
curl: (3) URL using bad/illegal format or missing URL curl: (3) unmatched close brace/bracket in URL position 1
原脚本内容
#!/bin/bash filename="$1" URL='http://localhost:8983/contentCleaner?action=clean' while read -r requestParam; do Req="curl ${URL} -X POST -H 'Accept:application/json' -H 'Content-Type:application/json' --data \"$requestParam\"" Res=eval $Req echo "Res:$Res" done < "$filename"
输入JSON示例(来自参数文件)
{ \"batchRequest\": { \"requests\": [ { \"contentData\": { \"contentText\": { \"ingestedContentSummary\": { \"provider\": { \"url\": \"twitter.com\" }, \"title\": \"Trump\" } } }, \"contentSource\": \"twitter\", } ] } }
修复方案
核心问题是用eval拼接执行curl命令,JSON里的括号、引号等特殊字符会被bash错误解析,导致curl识别到非法URL格式。直接调用curl并传递参数即可,完全不需要字符串拼接和eval。
修改后的脚本:
#!/bin/bash filename="$1" URL='http://localhost:8983/contentCleaner?action=clean' while read -r requestParam; do # 直接执行curl,避免字符串解析引发的特殊字符问题 Res=$(curl "$URL" -X POST -H 'Accept:application/json' -H 'Content-Type:application/json' --data "$requestParam") echo "Res:$Res" done < "$filename"
额外注意事项:
- 参数文件里的JSON如果带转义引号(
\"),实际会传递给接口带转义的字符串,可能不符合解析要求。建议将参数文件里的转义引号去掉,改成标准JSON格式。 - 原示例JSON中
"contentSource": "twitter",末尾多了一个逗号,属于非法JSON,需要删除,否则接口可能返回解析错误。修正后的标准JSON如下:
{ "batchRequest": { "requests": [ { "contentData": { "contentText": { "ingestedContentSummary": { "provider": { "url": "twitter.com" }, "title": "Trump" } } }, "contentSource": "twitter" } ] } }
内容的提问来源于stack exchange,提问作者isha chauhan
相关产品推荐
相关产品推荐

