Messi Of DevOps
Messi Of DevOps

Reputation: 43

jq won't allow to iterate over results

In code below I'm trying to match values from a bash array with values from json array using jq.

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 '.[]')

Consider the following JSON payload as a sample API response:

[{"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"}]

This works only partially, because I can't iterate over results ($PROJECTS).

printf "${PROJECTS[0]}" prints the whole array.

Am I missing something here?

Upvotes: 0

Views: 822

Answers (1)

peak
peak

Reputation: 116650

It appears that you should be using index/1 to check .tag_list (not .tag_list[]):

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

jq has no knowledge of bash array variables. For these, you therefore have two basic options: 1) use bash to iterate over the bash array variable (calling jq as often as necessary); 2) present the contents of the bash array variable in a way that jq can handle.

There are many variations of (2). Consider for example:

$ a=(a "b c")

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

Upvotes: 1

Related Questions