【发布时间】: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 编码的数组。