passing arguments to jq filter
Solution 1:
The jq program .dev.projects."$v"
in your example will literally try to find a key named "$v"
. Try the following instead:
jq --arg v "$PRJNAME" '.dev.projects[$v]' config.json
Solution 2:
You can use --argjson
too when you make your json.
--arg a v # set variable $a to value <v>;
--argjson a v # set variable $a to JSON value <v>;
Solution 3:
As asked in a comment above there's a way to pass multiple argumets. Maybe there's a more elegant way, but it works.
- If you are sure always all keys needed you can use this:
jq --arg key1 $k1 --arg key2 $k2 --arg key3 $k3 --arg key4 $k4 '.[$key1] | .[$key2] | .[$key3] | .[$key4] '
- If the key isn't always used you could do it like this:
jq --arg key $k ' if key != "" then .[$key] else . end'
- If key sometimes refers to an array:
jq --arg key $k ' if type == "array" then .[$key |tonumber] else .[$key] end'
of course you can combine these!
Solution 4:
you can do this:
key="dev.projects.prj1"
filter=".$key"
cat config.json | jq $filter