Der bedingte Ausdruck von jq ist if A then B else C end.
if-then-else ist ein Filter wie alle in jq eingebauten Filter: Er nimmt eine Eingabe und erzeugt eine Ausgabe.
Wenn der Ausdruck A einen „truthy“-Wert erzeugt, wertet der if-Filter B aus.
Andernfalls wertet er C aus.
Die Eingabe für den if-Filter wird an B oder C weitergegeben.
42 | if . < 50 then "small" else "big" end # => "small"
5 | if . % 2 == 0 then . / 2 else . * 4 end # => 20
Die else-Klausel ist optional; die folgenden beiden Anweisungen sind äquivalent.
if A then B else . end
if A then B end
Weitere Bedingungen kannst du mit elif hinzufügen.
42 | if . < 33 then "small"
elif . < 66 then "medium"
else "big"
end
# => "medium"
Verwende so viele elif-Klauseln, wie du brauchst.
Die einzigen „falschen“ Werte in jq sind: false und null.
Alles andere ist „wahr“, sogar die Zahl Null und der leere String, das leere Array und das leere Objekt.
Mit den booleschen Operatoren and und or kannst du komplexe Abfragen erstellen.
42 | if . < 33 or . > 66 then "big or small"
else "medium"
end
Zum Negieren verwendest du not. Das ist ein Filter, kein Operator.
42 | if (. < 33 or . > 66 | not) then "medium"
else "big or small"
end
Der Alternativoperator ermöglicht es dir, einen „Standardwert“ anzugeben, wenn ein Ausdruck falsch oder null ist.
A // B
# This is identical to
if A then A else B end
Ein Beispiel:
[3, 5, 18] | add / 2 # => 13
[] | add / 2 # => error: null (null) and number (2) cannot be divided
[] | add // 0 / 2 # => 0
Programmierer, die aus anderen Sprachen kommen, erwarten vielleicht eine größere Vielfalt an bedingten Konstrukten, wie cond, case, switch, when, unless, ternäre Operatoren und so weiter.
Die oben aufgeführten Operatoren sind alles, was jq bietet.