【问题标题】:Iterating over output of jq with a for loop in bash [duplicate]在bash中使用for循环迭代jq的输出[重复]
【发布时间】:2020-11-28 15:03:17
【问题描述】:

各位开发者您好!

我在这件事上很难过,所以你的帮助会很好:)

我正在创建一个脚本 shell,它将定期(感谢 cron)在离线 mongodb 和 firebase 之间进行同步。

我使用jq 来处理我的 mongodb 的导出,但是这个在包含空格的字符串值上表现得很奇怪。

例如,我从名为 users 的 mongodb 集合(使用 --jsonArray 作为 mongoexport 选项)中获得了这个导出的文档,文件名为 mycollectionexported.json:

[{"_id":{"$oid":"5fc253c493b9f7363c8d1011"},"emailVerified":true,"disabled":false,"isKickstarter":false,"isPremiun":false,"gender":"Male","nationality":"None","type":"admin","optMarketing":false,"optNewsletter":false,"cguValidated":true,"providers":[],"email":"test@reflect.com","displayName":"John Doe","phoneNumber":"0644080050","homeAddress":{"street":"rue Pasteur","number":24,"zipcode":94270,"city":"Le Kremlin-Bicêtre","country":"France"},"familyId":{"$oid":"5fc253c493b9f7363c8d1010"},"createdAt":{"$date":"2020-11-28T13:42:28.51Z"},"updatedAt":{"$date":"2020-11-28T13:42:28.51Z"},"__v":0}]

您可以看到,对于“displayName”、“homeAddress.street”或“homeAddress.city”等键,值中有空格。

当我尝试使用 jq 将新导出的集合存储到经典变量中,并将其显示在标准输出上时,jq 的行为非常奇怪。

脚本执行:

#!/bin/bash

documents=$(jq -c ".[]" ./mycollectionexported.json)
for document in $documents; do
  echo ""
  echo $document
done

输出:

{"_id":{"$oid":"5fc253c493b9f7363c8d1011"},"emailVerified":true,"disabled":false,"isKickstarter":false,"isPremiun":false,"gender":"Male","nationality":"None","type":"admin","optMarketing":false,"optNewsletter":false,"cguValidated":true,"providers":[],"email":"test@reflect.com","displayName":"John

Doe","phoneNumber":"0644080050","homeAddress":{"street":"rue

Pasteur","number":24,"zipcode":94270,"city":"Le

Kremlin-Bicêtre","country":"France"},"familyId":{"$oid":"5fc253c493b9f7363c8d1010"},"createdAt":{"$date":"2020-11-28T13:42:28.51Z"},"updatedAt":{"$date":"2020-11-28T13:42:28.51Z"},"__v":0}

预期(无换行符):

{"_id":{"$oid":"5fc253c493b9f7363c8d1011"},"emailVerified":true,"disabled":false,"isKickstarter":false,"isPremiun":false,"gender":"Male","nationality":"None","type":"admin","optMarketing":false,"optNewsletter":false,"cguValidated":true,"providers":[],"email":"test@reflect.com","displayName":"John Doe","phoneNumber":"0644080050","homeAddress":{"street":"rue Pasteur","number":24,"zipcode":94270,"city":"Le Kremlin-Bicêtre","country":"France"},"familyId":{"$oid":"5fc253c493b9f7363c8d1010"},"createdAt":{"$date":"2020-11-28T13:42:28.51Z"},"updatedAt":{"$date":"2020-11-28T13:42:28.51Z"},"__v":0}

这怎么可能? jq 文档中没有关于此的信息。 当我使用字符串值中不包含空格的 json 文件执行此操作时,它按预期工作...

感谢您的帮助和未来的答案:)

【问题讨论】:

标签: mongodb bash jq


【解决方案1】:

如果 jq 的输出是单行,为什么不直接:

echo "$documents"

或者,如果调用 jq 的结果是一个可能包含多个项目的流,并且如果您希望流中的每个项目都可以作为 bash 变量使用,那么如果您的 bash 足够先进-date,你可以使用mapfile(又名readarray);否则,您可以考虑使用 bash while 循环,例如大致如下:

declare -a document
while read -r item ; do
  document+=("$item")
done < <(jq -c ....)

这里的想法是使用 -c 选项调用 jq 可确保 jq 发出的唯一原始换行符将是标记流中项目的换行符。

【讨论】:

    猜你喜欢
    • 2023-03-24
    • 1970-01-01
    • 2018-03-01
    • 2016-03-29
    • 2018-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-09
    相关资源
    最近更新 更多