我正在尝试执行bash脚本,但我得到了以下错误:
curl: (3) URL using bad/illegal format or missing URL
curl: (3) unmatched close brace/bracket in URL position 1
我尝试过几种方法,比如在json中转义“in json”,在curl请求中使用-g,在Req变量周围使用,而不是使用eval,但是我无法修复这个问题。
#!/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"
我作为param传递给bash命令的文件包含一个json数据列表,该列表由新行分隔。bash脚本遍历json并填充curl请求。下面是一个请求的示例:
{ \"batchRequest\": { \"requests\": [ { \"contentData\": { \"contentText\": { \"ingestedContentSummary\": { \"provider\": { \"url\": \"twitter.com\" }, \"title\": \"Trump\" } } }, \"contentSource\": \"twitter\", } ] } }
发布于 2022-11-02 11:48:08
不要(尝试)将shell命令放入(标量)变量中。只适用于最简单的情况,而且您的情况并不简单。我们以前有很多关于这个问题的Q,但不幸的是,它们很难找到。相反,作为参考,请参阅https://mywiki.wooledge.org/BashFAQ/050。
对于您的情况,只需执行正确的命令:
while read -r requestParam; do
Res=$( curl ${URL} -H 'Accept:application/json' -H 'Content-Type:application/json' --data "$requestParam" ) # -X POST
echo "Res:$Res"
done < $filename
您不需要-X POST
,因为所有--data*
选项都会自动设置它。此外,<$var (和>$var >>$var <<$var <<<$var)不受单词拆分和全局化的限制,因此不需要双引用。(与此相反,命令参数所做的"$requestParam"
是这样的。)
或者,由于您对结果所做的唯一事情是使用前缀输出结果,所以可以简化为
while read -r requestParam; do
curl ${URL} -H 'Accept:application/json' -H 'Content-Type:application/json' --data "$requestParam" | sed 's/^/Res:/'
done <$filename
如果每个主体都有一个换行符(如您的输入文件),那么
xargs <$filename -I{} curl $URL -H... -H... --data {} | sed 's/^/Res:/'
https://stackoverflow.com/questions/74287663
复制相似问题