jq
's conditional expression is if A then B else C end
.
if-then-else
is a filter like all jq
builtins: it takes an input and produces an output.
If the expression A
produces a "truthy" value, then the if
filter evaluates B
.
Otherwise it evaluates C
.
The input to the if
filter will be passed to B
or C
.
42 | if . < 50 then "small" else "big" end # => "small"
5 | if . % 2 == 0 then . / 2 else . * 4 end # => 20
The else
clause is optional in the current jq
release (version 1.7):
the following two statements are equivalent.
if A then B else . end
if A then B end
The else
clause is mandatory in the previous v1.6 release.
Omitting it produces errors.
$ /bin/jq --version
jq-1.6
$ /bin/jq -n 'if 1 < 2 then "OK" end'
jq: error: syntax error, unexpected end (Unix shell quoting issues?) at <top-level>, line 1:
if 1 < 2 then "OK" end
jq: error: Possibly unterminated 'if' statement at <top-level>, line 1:
if 1 < 2 then "OK" end
jq: 2 compile errors
Further conditions can be added with elif
.
42 | if . < 33 then "small"
elif . < 66 then "medium"
else "big"
end
# => "medium"
Use as many elif
clauses as you need.
The only "false" values in jq
are: false
and null
.
Everything else is "true", even the number zero and the empty string, array and object.
The boolean operators and
and or
can be used to build complex queries.
42 | if . < 33 or . > 66 then "big or small"
else "medium"
end
To negate, use not
. This is a filter not an operator.
42 | if (. < 33 or . > 66 | not) then "medium"
else "big or small"
end
The alternative operator allows you to specify a "default" value if an expression is false or null.
A // B
# This is identical to
if A then A else B end
To demonstrate
[3, 5, 18] | add / 2 # => 13
[] | add / 2 # => error: null (null) and number (2) cannot be divided
[] | add // 0 / 2 # => 0
Programmers coming from different languages might be expecting a wider variety of conditional commands, such as cond
, case
, switch
, when
, unless
, a ternary operator, etc.
The operators listed above are everything that jq
offers.