【问题标题】:jq won't allow to iterate over resultsjq 不允许迭代结果
【发布时间】:2017-08-30 07:17:22
【问题描述】:

在下面的代码中,我尝试使用 jq 将 bash 数组中的值与 json 数组中的值进行匹配。

PROJECTS=$(curl -H "PRIVATE-TOKEN: ${GITLAB_TOKEN}" "${GITLAB_URL}/api/v4/projects")
for GITLAB_TAG in "${GITLAB_TAGS[@]}"; do
    PROJECTS=`echo "${PROJECTS}" \
    | jq --arg gitlab_tag "$GITLAB_TAG" '[ .[] | select(.tag_list[] | contains($gitlab_tag)) ]'`
done

PROJECTS=$(echo "$PROJECTS" | jq -r '.[]')

将以下 JSON 负载视为示例 API 响应:

[{"id":31,"description":"","default_branch":null,"tag_list":["dev","app"],"archived":false,"visibility":"private"},{"id":28,"description":"","default_branch":"master","tag_list":["dev","app"],"archived":false,"visibility":"private"}]

这仅部分有效,因为我无法迭代结果 ($PROJECTS)。

printf "${PROJECTS[0]}" 打印整个数组。

我错过了什么吗?

【问题讨论】:

  • 您能发布一个 JSON 有效负载的示例吗?这样你会得到更多的帮助。
  • 感谢您指出这一点。
  • 您可以将所有标签放在一起:echo "..json..." | jq --argjson gitlab_tag '["dev", "app"]' '.[] | select(.tag_list | contains($gitlab_tag))'。并将其作为 JSON 参数传递。
  • 我采用了这种方法,结果是一样的。我的 json 条目已正确过滤,但我无法遍历结果。 printf "${PROJECTS[0]}" 打印出所有内容而不是第一个 json 对象。
  • 那是因为PROJECTS不是shell数组;它是一个常规变量,包含一个字符串,其值为 JSON 编码的数组。

标签: arrays json bash jq


【解决方案1】:

看来您应该使用index/1 来检查 .tag_list(而不是 .tag_list[]):

[ .[] | select(.tag_list | index($gitlab_tag)) 

jq 不知道 bash 数组变量。对于这些,您因此有两个基本选择:1)使用 bash 迭代 bash 数组变量(根据需要经常调用 jq); 2) 以 jq 可以处理的方式呈现 bash 数组变量的内容。

(2) 有很多变体。例如:

$ a=(a "b c")

$ printf "%s\n" "${a[@]}" | jq -R | jq -s  
[
  "a",
  "b c"
]

【讨论】:

  • 两种解决方案:我的和你的都可以。问题是,我无法遍历 $PROJECTS。由于某种原因,它被视为字符串...
  • @MessiOfPHP - 查看更新的答案。不要忘记 ${PROJECTS[@]} 与 "${PROJECTS[@]}" 不同。
猜你喜欢
  • 2021-09-30
  • 2018-11-16
  • 2015-02-16
  • 1970-01-01
  • 2011-07-26
  • 1970-01-01
  • 2014-01-31
  • 2011-01-18
  • 2011-12-12
相关资源
最近更新 更多