Zur Erinnerung: Ein jq-Programm ist eine Pipeline aus Ausdrücken.
Variablenzuweisung folgt dieser Regel: Eine Variablenzuweisung ist ein Ausdruck, der so aussieht:
... | expr as $varname | ...
Wie beim Identitätsausdruck . ist die Ausgabe der Variablenzuweisung dieselbe wie ihre Eingabe.
Das Setzen des Variablenwerts ist ein Seiteneffekt.
Ein Beispiel, das zeigt, dass . nach der Zuweisung dieselbe Eingabe ist wie die ursprüngliche:
$ jq -c -n '42 | (. * 2) as $double | [., $double]'
[42,84]
Der Gültigkeitsbereich der Variable ist „lexikalisch“: Die Variable bleibt für den Rest der Pipeline im Gültigkeitsbereich. Variablen, die in Funktionen definiert werden (zu Funktionen kommen wir später), sind „lokal“ für die Funktion.
Die Variable muss mit $ beginnen.
Der Rest des Variablennamens ist ein Bezeichner: Er beginnt mit einem Buchstaben oder Unterstrich, gefolgt von Buchstaben, Zahlen oder Unterstrichen.
Aus dem Handbuch:
Mehrere Variablen lassen sich mit einem einzigen
as-Ausdruck deklarieren, indem du ein Muster angibst, das zur Struktur der Eingabe passt (das nennt man „Destrukturierung“).
Beispiele:
[1, 2, 3] as [$a, $b, $c]
| [$a, $b, $c] # => [1, 2, 3]
{"foo": "bar", "len": [10, 20]} as {foo: $f, len: [$h, $w]}
| [$f, $h, $w] # => ["bar", 10, 20]
Wenn der Variablenname zum Objektschlüssel passt, bietet das eine Abkürzung:
{"x": 4, "y": 7} as {$x, $y}
| [$x, $y] # => [4, 7]
{"foo": "bar", "len": [10, 20]} as {$foo, $len}
| [$foo, $len] # => ["bar", [10, 20]]
Dieselbe Abkürzung funktioniert in umgekehrter Richtung auch für die Objekterstellung
4 as $x | 7 as $y | {$x, $y} # => {"x":4, "y": 7}
Wie das obige Beispiel zeigt, sind Variablen praktisch, um Konstanten zu speichern. Es ist besser, Konstanten einen Namen zu geben, als „magische Zahlen“ im Code auftauchen zu lassen.
Oft ist es lesbarer, auf Variablen zu verzichten.
Betrachte das Berechnen des Durchschnitts einer Liste von Zahlen
[2, 4, 8, 7]
| add as $sum
| length as $len
| $sum / $len
verglichen mit
[2, 4, 8, 7] | add / length
Das zeigt einen der stärksten Aspekte von jq: Die Eingabe eines Filters steht jedem Teilausdruck zur Verfügung:
[2,4,8,7] wird an add übergeben (das die Zahlen summiert, indem es den +-Operator auf alle Elemente anwendet)[2,4,8,7] auch an length übergebenjq-Operatoren, die du für die Lernübung brauchst//
Der Ausdruck a // b gibt b aus, wenn a falsch oder null ist, andernfalls gibt er a aus.
Im Zusammenhang mit dem Setzen einer Variable ist das sehr praktisch, um einen Standardwert anzugeben:
(.input.theAnswer // 42) as $answer | ...
+, -, * sind die üblichen Operatoren für numerische Addition, Subtraktion und Multiplikation.In dieser Übung schreibst du etwas Code, um eine großartige Lasagne aus deinem Lieblingskochbuch zuzubereiten.
Du hast vier Aufgaben, die alle mit der Zeit zu tun haben, die du für das Kochen der Lasagne brauchst.
Definiere eine Konstante mit dem Namen $expected_minutes_in_oven.
Laut Kochbuch beträgt die erwartete Backzeit 40 Minuten:
$ jq -n -f lasagna.jq
{
"expected_minutes_in_oven": 40,
...
Dieser Wert nimmt die tatsächlichen Minuten, die die Lasagne bereits im Ofen war, als Eingabewert und gibt zurück, wie viele Minuten die Lasagne noch im Ofen bleiben muss. Grundlage dafür ist die erwartete Backzeit aus der vorherigen Aufgabe.
$ echo '{"actual_minutes_in_oven": 18}' | jq -f lasagna.jq
{
"expected_minutes_in_oven": 40,
"remaining_minutes_in_oven": 22,
...
Die Vorbereitungszeit ist die Zeit, die du brauchst, um die Lasagne fertigzumachen, bevor sie in den Ofen kommt. Für jede Schicht brauchst du 2 Minuten.
$ echo '{"number_of_layers": 3}' | jq -f lasagna.jq
{
...
"preparation_time": 6,
...
Berechne, wie viele Minuten du insgesamt mit dem Kochen der Lasagne verbracht hast. Das ist die Summe aus der Vorbereitungszeit und der Zeit, die die Lasagne im Moment im Ofen verbracht hat.
$ echo '{"actual_minutes_in_oven": 10, "number_of_layers": 2}' | jq -f lasagna.jq
{
...
"total_time": 14,
...
Melde dich bei Exercism an, um jq mit 12 Konzepte75 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.