jq不允许迭代结果

时间:2017-04-04 21:45:25

标签: arrays json bash jq

在下面的代码中,我尝试使用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]}"打印整个数组。

我在这里错过了什么吗?

1 个答案:

答案 0 :(得分: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"
]