Ich habe ein Skript geschrieben, um einen bestimmten Wert abzurufen file.json
. Es funktioniert, wenn ich den Wert für jq gebe select
, aber die Variable scheint nicht zu funktionieren (oder ich weiß nicht, wie ich sie verwenden soll).
#!/bin/sh
#this works ***
projectID=$(cat file.json | jq -r '.resource[] | select(.username=="[email protected]") | .id')
echo "$projectID"
EMAILID=myemail@hotmail.com
#this does not work *** no value is printed
projectID=$(cat file.json | jq -r '.resource[] | select(.username=="$EMAILID") | .id')
echo "$projectID"
json
bash
environment-variables
jq
asidd
quelle
quelle
jq -r --arg var "$var" '.[$var]'
Stackoverflow.com/questions/34745451/…Antworten:
Überlegen Sie auch, ob Sie die Shell-Variable (EMAILID) als jq-Variable übergeben möchten (hier zur Veranschaulichung auch EMAILID):
Nachtrag
Für den Datensatz besteht eine andere Möglichkeit darin, die
env
Funktion von jq für den Zugriff auf Umgebungsvariablen zu verwenden. Betrachten Sie beispielsweise diese Folge von Bash-Befehlen:Die Ausgabe ist eine JSON-Zeichenfolge:
quelle
jq
den Filter ordnungsgemäß mit dem Wert erstellen, anstattbash
eine Zeichenfolge zu erstellen,jq
die als Filter interpretiert wird. (Überlegen Sie, was passiert, wenn der Wert von aEMAILID
enthält)
.)function n2 { termux-contact-list |jq -r --arg v1 "$1" '.[] | select(.name==$v1)|.number' }
Aufruf:n2 Name1
env
Funktion von jq wird zwischen jq 1.4 und 1.5+ geändert, sodass Verweise aufenv.EMAILID
(im Beispiel dieser Antwort) in jq 1.4 nicht funktionieren. Daher wird empfohlen, das--arg EMAILID "$EMAILID"
Konstrukt zu verwenden, wenn Sie jq 1.4 verwenden müssen. Hoffe das hilft; Ich habe nur einen Tag--arg
werden als Zeichenfolgen übergeben. Wenn Sie Daten eines anderen JSON-Typs übergeben möchten, verwenden Sie--argjson
, wodurch die Zeichenfolge als JSON analysiert wird, z. B.--argjson myObj '{"a": [1, 2]}'
Ich habe dieses Problem gelöst, indem ich mich den inneren doppelten Anführungszeichen entzogen habe
quelle
-c
Es ist ein Zitat, das Sie brauchen:
Wenn Sie einfache Anführungszeichen setzen , um die Hauptzeichenfolge abzugrenzen, wird die Shell
$EMAILID
wörtlich genommen.„Double - Zitat“ jeder wörtlich , die Leerzeichen / Metazeichen und enthält jede Expansion:
"$var"
,"$(command "$var")"
,"${array[@]}"
,"a & b"
. Verwendung'single quotes'
für Code oder Literal$'s: 'Costs $5 US'
,ssh host 'echo "$HOSTNAME"'
. Siehehttp://mywiki.wooledge.org/Quotes
http://mywiki.wooledge.org/Arguments
http://wiki.bash-hackers.org/syntax/words
quelle
termux-contact-list |jq -r '.[] | select(.name=='$1')|.number'
. Ergebnis:jq Compile error
jq
mögen aber keine einfachen Anführungszeichen:jq: error: syntax error, unexpected INVALID_CHARACTER (Unix shell quoting issues?)
Poste es hier, da es anderen helfen könnte. In einer Zeichenfolge kann es erforderlich sein, die Anführungszeichen an jq zu übergeben. Gehen Sie mit jq wie folgt vor:
in bash könnte man machen
im Wesentlichen den Anführungszeichen entkommen und an jq weitergeben
quelle
Eine andere Möglichkeit, dies zu erreichen, ist das jq-Flag "--arg". Verwenden Sie das ursprüngliche Beispiel:
Hier habe ich diese Lösung gefunden: https://github.com/stedolan/jq/issues/626
quelle
Ich weiß, es ist etwas später zu antworten, sorry. Aber das funktioniert bei mir.
Und jetzt kann ich den Inhalt der Variablen abrufen und an jq übergeben
In meinem Fall musste ich doppelte Anführungszeichen und Anführungszeichen verwenden, um auf den Variablenwert zuzugreifen.
Prost.
quelle
Jq hat jetzt eine bessere Möglichkeit, auf Umgebungsvariablen zuzugreifen. Sie können env.EMAILI verwenden:
quelle
Wenig unabhängig, aber ich werde es trotzdem hier setzen. Für andere praktische Zwecke können Shell-Variablen verwendet werden als -
quelle