Bash 从shell脚本向文件追加多个curl请求的输出

Bash 从shell脚本向文件追加多个curl请求的输出,bash,shell,curl,Bash,Shell,Curl,我试图通过内部API获取JSON输出,并在cURL请求之间向参数值添加100。我需要循环,因为它将每个请求的最大结果数限制为100。我被告知“增加,你应该能够得到你需要的” 总之,我写的是: #!/bin/bash COUNTER=100 until [ COUNTER -gt 30000 ]; do curl -vs "http://example.com/locations/city?limit=100&offset=$COUNTER" >> cities.js

我试图通过内部API获取JSON输出,并在cURL请求之间向参数值添加100。我需要循环,因为它将每个请求的最大结果数限制为100。我被告知“增加,你应该能够得到你需要的”

总之,我写的是:

#!/bin/bash

COUNTER=100
until [ COUNTER -gt 30000 ]; do
    curl -vs "http://example.com/locations/city?limit=100&offset=$COUNTER" >> cities.json
    let COUNTER=COUNTER+100
done
问题是,我在终端中收到了一堆奇怪的消息,我试图重定向输出的文件也仍然包含它原来的100个对象。我觉得我可能错过了一些非常明显的东西。有什么想法吗?我确实使用了一个关于直到循环的老教程,所以可能是语法问题

提前谢谢你


编辑:我不反对完全替代的方法,但我希望这会有点简单。我认为我缺乏经验是主要的限制因素。

如果您只想覆盖文件的内容一次,那么在整个循环中

#!/bin/bash
# ^-- NOT /bin/sh, as this uses bash-only syntax

for (( counter=100; counter<=30000; counter+=100 )); do
    curl -vs "http://example.com/locations/city?limit=100&offset=$counter"
done >cities.json
#/bin/bash
#^——不是/bin/sh,因为它只使用bash语法
对于((counter=100;countercity.json)

这实际上比在每个
curl
命令上放置
>cities.json
更有效,因为它只打开输出文件一次,并且有副作用(您似乎想要)当循环开始时清除文件以前的内容的方法。

您可能会发现使用GNU Parallel可以更快、更容易地完成此操作:

parallel -k curl -vs "http://example.com/locations/city?limit=100\&offset={}" ::: $(seq 100 100 30000) > cities.json

为什么它不包含它的原始内容?你只是在附加。关于“终端的奇怪消息”--所有将要转到curl的stderr的内容都将被打印到终端,因为您使用的是
curl-v
,这就是您要求的行为。如果您希望curl打印不同的消息,我建议您决定您实际需要的详细程度。@CharlesDuffy我认为我的原始评论有点不准确。我但当我停止进程时,没有添加任何内容-内容仍然是我第一次使用cURL时文件中的原始100个对象。几分钟后我停止了脚本,因为请求挂起。我使用的选项也是错误的(我认为-s应该抑制一些stdout&stderr),这就解释了终端中的消息。我没有正式的培训,所以这对我来说有点新鲜。我到现在为止还没有使用并行的经验-谢谢!在你的经验中,这对循环更有效吗?另外,使用并行而不是shell脚本有什么缺点吗?当你有很多事情要并行处理时,GNU并行是很好的,比如从60000个图像中剥离元数据,或者当你有很多事情要做,而这些事情有很高的延迟时-比如
curl
ping
,你可以将7件事情的延迟隐藏在第8件事情的延迟后面,并获得更好的性能,因为所有这些延迟都是并行发生的。对于本质上连续的事情来说,这并不是最好的r、 这是一个非常宝贵的工具箱工具,可以很快地尝试解决许多问题-所以,吸一吸,看看!您可能会发现,您可以在
-k
之后添加
-j 16
,以并行运行16次卷发。。。