循环中的JSON键和bash变量

时间:2018-07-09 14:12:56

标签: json bash jq

我需要捕获他们使用的所有空间/聊天室,并确保新帐户连接到所有这些空间。我可以使用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”评估(检查isLockedtrue还是false),然后执行其他一些API使用其他变量调用。由于某些原因,可能是由于我对jq缺乏了解,我无法使循环和变量提取正常工作。

1 个答案:

答案 0 :(得分:4)

您不需要在这里使用jq在JSON对象上循环 ,您只需在每个对象中插入变量并根据需要执行逻辑即可。由于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

现在在shell上下文中对变量idtitleflag进行处理。如果您想使用更多变量,只需将其添加到原始jq过滤器中即可。

如果您不希望循环在子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)