it-swarm.com.de

übergabe von Argumenten an den JQ-Filter

Hier ist meine config.json:

{
    "env": "dev",
    "dev": {
        "projects" : {
            "prj1": {
                "dependencies": {},
                "description": ""
            }
        }
    }
}

Hier sind meine bash-Befehle:

PRJNAME='prj1'

echo $PRJNAME

jq --arg v "$PRJNAME" '.dev.projects."$v"' config.json 
jq '.dev.projects.prj1' config.json 

Die Ausgabe:

prj1
null
{
  "dependencies": {},
  "description": ""
}

$ PRJNAME ist also prj1, aber der erste Aufruf gibt nur null aus.

Kann mir jemand helfen?

20
lisi4ok

Das jq-Programm .dev.projects."$v" in Ihrem Beispiel versucht buchstäblich, einen Schlüssel mit dem Namen "$v" zu finden. Versuchen Sie stattdessen Folgendes:

jq --arg v "$PRJNAME" '.dev.projects[$v]' config.json 
29
user3899165

sie können auch --argjson verwenden, wenn Sie Ihren Json erstellen.

--arg a v   set variable $a to value <v>;
--argjson a v   set variable $a to JSON value <v>;
6
Sebastien DIAZ

Wie in einem Kommentar oben gefragt, gibt es eine Möglichkeit, mehrere Argumente zu übergeben. Vielleicht gibt es einen eleganteren Weg, aber es funktioniert.

  • Wenn Sie sicher sind, dass immer alle Schlüssel benötigt werden, können Sie Folgendes verwenden:
jq --arg key1 $k1 --arg key2 $k2 --arg key3 $k3 --arg key4 $k4 '.[$key1] | .[$key2] | .[$key3] | .[$key4] '

  • Wenn der Schlüssel nicht immer verwendet wird, können Sie dies folgendermaßen tun:
jq --arg key $k ' if key != "" then .[$key] else . end'

  • Wenn key sich manchmal auf ein Array bezieht:
jq --arg key $k ' if type == "array" then .[$key |tonumber] else .[$key] end'

natürlich kannst du diese kombinieren!

2
LuWa