Json 在Bash循环中检测分页cURL响应的最后一页 目标

Json 在Bash循环中检测分页cURL响应的最后一页 目标,json,bash,api,curl,jq,Json,Bash,Api,Curl,Jq,使用cURL和Bash将分页RESTAPI调用中的所有对象包含在单个JSON文件中。此组合列表将输入到Power BI报告中 细节 一个请求最多返回100个对象。总共有400多个对象。总数随着时间的推移而增长。我不想维护一个脚本,其中包含类似于0 100 200 300 400中set的;执行,因为这需要我手动将集合与当前对象数进行匹配。为了节省人力,我想要一个脚本自动检测最后一页何时被处理,然后中断 为了实现我的目标,到目前为止,我提出的计划是将100个项目的增量集提取到自己的JSON文件中,

使用cURL和Bash将分页RESTAPI调用中的所有对象包含在单个JSON文件中。此组合列表将输入到Power BI报告中

细节 一个请求最多返回100个对象。总共有400多个对象。总数随着时间的推移而增长。我不想维护一个脚本,其中包含类似于0 100 200 300 400中set的
;执行
,因为这需要我手动将集合与当前对象数进行匹配。为了节省人力,我想要一个脚本自动检测最后一页何时被处理,然后中断

为了实现我的目标,到目前为止,我提出的计划是将100个项目的增量集提取到自己的JSON文件中,然后用
cat
组装它们,并使用JQ提取相关的JSON键/值。Bash的原因是它是我所知道的唯一编程

企图 (基于)

中间页
谢谢你的建议和想法。

假设我关于
startIndex
的理论成立,并实现@CharlesDuffy关于
jq
的建议,这就变成了

for ((i=0; ; i+=100)); do
    contents=$(curl -u "username:password" -H "Content-Type: application/json" "https://<url>/api/core/v3/places?count=100&startIndex=$i")
    echo "$contents" > $i.json
    if jq -e '.list | length == 0' >/dev/null; then 
       break
    fi <<< "$contents"
done
((i=0;i+=100))的
;做
contents=$(curl-u“用户名:密码”-H“内容类型:应用程序/json”https:///api/core/v3/places?count=100&startIndex=$i)
echo“$contents”>$i.json
如果jq-e'.list | length==0'>/dev/null;然后
打破

好吧,看看页面示例
list
键从不包含
null
,这就是regexp永远不匹配的原因之一。您可能还需要说明冒号周围的空格(
)。我一改为
“列表”,您就完全正确了@weirdan,谢谢您:[]“
它起作用了。我不明白那里发生了什么,所以谢谢你解释!顺便说一句,我倾向于建议使用
jq
而不是正则表达式进行测试。使用
-e
,你可以告诉它根据表达式是否为真来设置退出状态,让你像使用其他表达式一样使用
如果jq…
明智地使用
如果grep…
jq
是一个很好的建议索引,那么对于
$startIndex
部分,我实际上认为第一页应该在它的
下一个
元素中显示100。该元素指示可以获取结果下一页的url,第二页以记录100开头(以100为一个页面大小)工作得很好。谢谢你怪人和@CharlesDuffy
{
  "itemsPerPage" : 100,
  "links" : {
    "next" : "https://<url>/api/core/v3/places?sort=titleAsc&count=100&startIndex=0" <--- with my script, startIndex is erroneously 100
  },
  "list" : [ {
...
{
  "itemsPerPage" : 100,
  "links" : {
    "previous" : "https://<url>/api/core/v3/places?sort=titleAsc&count=100",
    "next" : "https://<url>/api/core/v3/places?sort=titleAsc&count=100&startIndex=200"
  },
  "list" : [ {
...
{
  "itemsPerPage" : 100,
  "links" : {
    "previous" : "https://<url>/api/core/v3/places?sort=titleAsc&count=100&startIndex=400"
  },
  "list" : [ {
...
{
  "itemsPerPage" : 100,
  "list" : [ ],
  "startIndex" : 500
}
for ((i=0; ; i+=100)); do
    contents=$(curl -u "username:password" -H "Content-Type: application/json" "https://<url>/api/core/v3/places?count=100&startIndex=$i")
    echo "$contents" > $i.json
    if jq -e '.list | length == 0' >/dev/null; then 
       break
    fi <<< "$contents"
done