我创建了一个简单的脚本来存储来自第三方API的响应
请求就是这样。
https://externalservice.io/orders?key=password&records=50&offset=0
响应如下:
{
"results": [
{
"engagement": {
"id": 29090716,
"portalId": 62515,
"active": true,
"createdAt": 1444223400781,
"lastUpdated": 1444223400781,
"createdBy": 215482,
"modifiedBy": 215482,
"ownerId": 70,
"type": "NOTE",
"timestamp": 1444223400781
},
},
],
"hasMore": true,
"offset": 4623406
}
如果有一个 hasMore 属性,我需要读取offset
值以获取下一组记录。
现在,我已经创建了一个脚本,该脚本只是在估计的记录数上循环(我相信有),并且认为增加偏移量是可行的,但事实并非如此,因为偏移量不是增量的。
#!/bin/bash
for i in {1..100}; do
curl -s "https://externalservice.io/orders?key=password&records=50&offset=$i" >>outfile.txt 2>&1
done
有人可以解释我如何继续阅读脚本offset
直到hasMore=false
吗?
答案 0 :(得分:0)
您可以使用jq实用程序从json读取值:
$ jq -r ".hasMore" outfile
true
这是您可以使用的:
more="true"
offset=0
while [ $more = "true" ]; do
echo $offset
response=$(curl -s "https://example.com/orders?offset=$offset")
more=$(echo $response | tr '\r\n' ' ' | jq -r ".hasMore")
offset=$(echo $response | tr '\r\n' ' ' | jq -r ".offset")
done
答案 1 :(得分:0)
您可以使用 jq 实用程序从您的 json 响应中提取特定属性:
$ jq -r ".hasMore" outfile
true
jq 需要完全有效的 json 输入,否则会打印错误。
最常见的错误是将echo
json 存储在变量中。一个错误,因为 echo 将解释您的 json 中所有转义的换行符,并将在值内发送未转义的换行符,导致 jq 抛出 parse error: Invalid string: control characters from U+0000 through U+001F must be escaped at line
消息。
为了避免修改 json(并避免错误),我们需要使用 printf
而不是 echo
。
这是不破坏json内容的解决方案:
more="true"
offset=0
while [ $more = "true" ]; do
echo $offset
response=$(curl -s "https://example.com/orders?offset=$offset")
more=$(printf "%s\n" "$response" | jq -r ".hasMore")
offset=$(printf "%s\n" "$response" | jq -r ".offset")
done