Passing variables to jq
Passing a shell / bash variable / environment variable to jq
is simple using the native functionality of:
--arg name value
or --argjson name value
.
How to pass variable to jq
filters
This is a generic projects.json
file:
1{
2 "projects": [
3 {
4 "name": "project 1",
5 "owner": "owner 1",
6 "id": 1,
7 "version": "2.3.0"
8 },
9 {
10 "name": "project 2",
11 "owner": "owner 1",
12 "id": 2,
13 "version": "1.54.0"
14 },
15 {
16 "name": "project 3",
17 "owner": "owner 2",
18 "id": 3,
19 "version": "4.9.2"
20 }
21 ]
22}
String variables
Retrieve project information via a name supplied by a user.
1echo "Enter name: "
2read name
3
4cat projects.json |
5 jq -r --arg n "$name" '.projects[]|select(.name == $n)'
Output:
1Enter name:
2project 1
3{
4 "name": "project 1",
5 "owner": "owner 1",
6 "id": 1,
7 "version": "2.3.0"
8}
--arg name value
: value
is automatically interpreted as a string.
Number variables
Retrieve project information via an id supplied by a user.
1echo "Enter id: "
2read id
3
4cat projects.json |
5 jq -r --arg id "$id" '.projects[]|select(.id == ($id|tonumber))'
Output:
1Enter id:
22
3{
4 "name": "project 2",
5 "owner": "owner 1",
6 "id": 2,
7 "version": "1.54.0"
8}
--arg name value
: value
must be explicitly converted to a number using the native tonumber
function.
Optionally, --argjson name value
may be used in jq
versions 1.5 or higher. --argjson
respects the value type. Following the same example as before,
1echo "Enter id: "
2read id
3
4cat projects.json |
5 jq -r --argjson id "$id" '.projects[]|select(.id == $id)'
Output:
1Enter id:
22
3{
4 "name": "project 2",
5 "owner": "owner 1",
6 "id": 2,
7 "version": "1.54.0"
8}