3

我需要捕获他们使用的所有空间/聊天室,并确保新帐户连接到所有这些空间。我可以curl用来调用服务 Spark API 并获取空间列表,并对其进行处理jq以将其置于可敬的格式中。我最终得到的是一系列 50 到 900 个(取决于使用)JSON 对象(每个空间/房间一个)。

{  
   "items":[  
      {  
         "id":"Y2lzY29zcGFyazovL3VzL1JPT00vNGY0Y2Q5NDAtN2JkZi0xMWU4LThiMjMtMTU0YzAyNTI0YzBh",
         "title":"(CISCO INTERNAL): FTB - CMS Opportunity",
         "type":"group",
         "isLocked":false,
         "lastActivity":"2018-06-29T21:05:55.994Z",
         "creatorId":"Y2lzY29zcGFyazovL3VzL1BFT1BMRS9kMWI3MDRhNS05ZmU0LTQ3MTYtOGY2Zi02OGEyNjVjZGQ5YzM",
         "created":"2018-06-29T20:59:27.316Z"
      },
      {  
         "id":"Y2lzY29zcGFyazovL3VzL1JPT00vMTQxODk5MTAtN2JiYS0xMWU4LThiOWUtMjMwOWM4Y2NiYWMz",
         "title":"USU Cisco Webex EDU Program",
         "type":"group",
         "isLocked":true,
         "lastActivity":"2018-06-29T19:46:14.993Z",
         "creatorId":"Y2lzY29zcGFyazovL3VzL1BFT1BMRS8wZThjMzg3Yy0zNzc5LTRlYTEtYmY2My1mNzZmMDJkYzVjM2M",
         "created":"2018-06-29T16:32:56.609Z"
      },
      {  
         "id":"Y2lzY29zcGFyazovL3VzL1JPT00vZjYyNDg1NjAtNzg5Yy0xMWU4LTlmYzItNGZhYzQwZWE4MTA4",
         "title":"Darren TeamSpace Space",
         "type":"group",
         "isLocked":false,
         "lastActivity":"2018-06-26T15:00:03.332Z",
         "teamId":"Y2lzY29zcGFyazovL3VzL1RFQU0vZWQ5Mzc1ZDAtZjE1MC0xMWU1LWFjNWUtNTNiMzQxMDkxMTU1",
         "creatorId":"Y2lzY29zcGFyazovL3VzL1BFT1BMRS83YTBkMTJiMS1lODMxLTRkNmItYTAzMS0xMDU4Y2UwOTAwZTU",
         "created":"2018-06-25T17:26:57.561Z"
      }
   ]
}

我想在这里做的是创建一个快速而肮脏的脚本,然后可以循环处理这个 JSON 文件,将键作为变量拉入

(items.id = $id, items.title = $title, etc.) 

使用文件中的关联值,因此我可以执行一些基本的“if then else”评估(检查 if isLockedis trueor false),然后使用其他变量执行一些其他 API 调用。出于某种原因,这可能是我对 的不熟悉jq,我无法让循​​环和变量提取正常工作。

4

1 回答 1

5

您不需要在此处循环JSON 对象,使用jq,您只需在每个对象内插入变量并根据需要执行您的逻辑。由于 JSON 中的字段可能包含它们之间的空格,因此使用自定义分隔符|将它们拆分并在循环read命令中使用bash

jq --raw-output '.items[] | "\(.id)|\(.title)|\(.isLocked)"' json |
    while IFS="|" read -r id title flag; do
        printf '%s|%s|%s\n' "$id" "$title" "$flag"
    done

对变量做任何事情idtitle现在flag在 shell 上下文中。如果您想使用更多变量,只需将它们添加到原始jq过滤器中即可。

如果您不希望循环在子 shell 中运行,请使用 shell 提供的进程替换技术bash。这样做在同一个父 shell 中运行,并使命令的输出<(cmd)看起来好像它出现在一个临时文件中

while IFS="|" read -r id title flag; do
    printf '%s|%s|%s\n' "$id" "$title" "$flag"
done< <(jq --raw-output '.items[] | "\(.id)|\(.title)|\(.isLocked)"' json)
于 2018-07-09T14:48:50.023 回答