在下面的代码中,我尝试使用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]}"
打印整个数组。
我在这里错过了什么吗?
答案 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"
]