bash:执行curl请求时出错[重复]

sh7euo9m  于 2022-11-13  发布在  其他
关注(0)|答案(1)|浏览(271)

此问题在此处已有答案

Why does shell ignore quoting characters in arguments passed to it through variables? [duplicate](3个答案)
10天前关闭。
我正在尝试执行bash脚本,但遇到以下错误:

curl: (3) URL using bad/illegal format or missing URL
curl: (3) unmatched close brace/bracket in URL position 1

我已经尝试了几种方法,比如在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\", } ] } }
nvbavucw

nvbavucw1#

**不要(尝试)将shell命令放在(标量)变量中。**它只适用于非常简单的情况,而你的情况并不简单。我们有 * 很多 * 关于这个问题的以前的问题,但不幸的是它们很难搜索。作为参考,请参见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

并且 if 每个主体都有一个换行符(就像您的输入文件一样),以进一步

xargs <$filename -I{} curl $URL -H... -H... --data {} | sed 's/^/Res:/'

相关问题