循环 curl 获取请求 bash

Cur*_*yJB 6 bash curl control-flow

我正在尝试自动化 curl 脚本并最终使其也循环。我发现我不能使用任何循环,例如:

for i in `cat authors`
do
    curl *line here*   "www.test.com/autors?string="$i"&proc=39"
etc
Run Code Online (Sandbox Code Playgroud)

甚至是 CURL 的 env glob 变量

有没有办法在 curl 上为一个变量循环获取请求?

curl -H "Host: www.test.com" -G "www.test.com/autors?string="author+name"&proc=39"
Run Code Online (Sandbox Code Playgroud)

我得到的只是 CURL 的流量图,没有好的结果。我正在使用 bash

Cal*_*leb 6

试试这个结构:

 while read author; do
      curl "http://www.test.com/authors?string=$author&proc=39"
 done < authors
Run Code Online (Sandbox Code Playgroud)

这将节省您的猫,必须在反引号中做事等。如果您愿意,它还允许您从输入文件中读取几列,但是像在我的示例中一样指定一个要获取的变量将获得整个线。

  • 如果 `${author}` 包含空格或类似的字符,你需要对它们进行 URL 编码,否则你可能会发现你得到类似 `code 400, message Bad request syntax ('GET /authors?string=shakespeare, w.&amp;proc =39 HTTP/1.1')` 来自您的 HTTP 服务器。 (3认同)
  • 你试试看怎么样,然后说什么特别行不通。这种结构使得处理空格变得更加容易,例如整行都被读入变量。 (2认同)

小智 6

作者包含像空格这样的名字,我猜是点

几件事情正在发生:

首先,你做for循环的方式根本行不通。尝试这个:

 for i in `cat authors`
 do
    echo "Author = \"$i\""
 done
Run Code Online (Sandbox Code Playgroud)

看看发生了什么?每个空格分隔一个值$i。如果你有名字和姓氏,你会得到一行只有名字,一行只有姓。

现在试试这个:

cat authors | while read i
do
    echo "Author = \"$i\""
done
Run Code Online (Sandbox Code Playgroud)

好一些?现在,$i是你的整条线。(是的,我知道“无用的猫”,但看看我要去哪里!)

其次,您可能必须将这些空格和句点转换为有效的 URL 字符。必须将空格转换为%20. 让我们采取不同的方法:

 sed 's/ /%20/g' authors | while read test
do
    echo "curl *line here* www.test.com/authors?string=$i&proc=39"
done
Run Code Online (Sandbox Code Playgroud)

(现在,你明白我为什么有了cat。)

这应该打印出您的 curl 命令。我正在做的是获取authors文件并将空格转换为字符串%20。现在,我可以去掉也会引起问题的字符串周围的引号。

因此,我们现在可以摆脱回声,并运行实际的 CURL 命令:

 sed 's/ /%20/g' authors | while read test
do
    curl *line here* www.test.com/authors?string=$i&proc=39
done
Run Code Online (Sandbox Code Playgroud)

现在*line here*代表什么?这是您的选项列表吗?哦,你有autors,而不是作者在你的程序。你在这里打错了,还是你的程序应该是这样的?