J'ai écrit un script pour récupérer une certaine valeur file.json
. Cela fonctionne si je donne la valeur à jq select
, mais la variable ne semble pas fonctionner (ou je ne sais pas comment l'utiliser).
#!/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
la source
la source
jq -r --arg var "$var" '.[$var]'
stackoverflow.com/questions/34745451/...Réponses:
Envisagez également de passer la variable shell (EMAILID) en tant que variable jq (ici aussi EMAILID, à titre d'illustration):
Postscript
Pour mémoire, une autre possibilité serait d'utiliser la
env
fonction de jq pour accéder aux variables d'environnement. Par exemple, considérez cette séquence de commandes bash:La sortie est une chaîne JSON:
la source
jq
créer correctement le filtre en utilisant la valeur, plutôt que d'utiliserbash
pour créer une chaîne quijq
interprète comme un filtre. (Considérez ce qui se passe si la valeur deEMAILID
contient a)
.)function n2 { termux-contact-list |jq -r --arg v1 "$1" '.[] | select(.name==$v1)|.number' }
Appel:n2 Name1
env
fonction de jq est modifiée entre jq 1.4 et 1.5+, donc les références àenv.EMAILID
(dans l'exemple de cette réponse) ne fonctionnent pas dans jq 1.4, recommandant ainsi d'utiliser la--arg EMAILID "$EMAILID"
construction si vous devez utiliser jq 1.4. J'espère que cela t'aides; m'a juste pris un jour + pour comprendre cela par moi-même;)--arg
seront passés sous forme de chaînes. Si vous souhaitez transmettre des données d'un type JSON différent, utilisez--argjson
, qui analysera la chaîne en tant que JSON, par exemple--argjson myObj '{"a": [1, 2]}'
J'ai résolu ce problème en échappant les guillemets doubles internes
la source
-c
C'est un problème de devis, vous avez besoin de:
Si vous mettez des guillemets simples pour délimiter la chaîne principale, le shell prend
$EMAILID
littéralement.« Guillemets » chaque littéral qui contient des espaces / métacaractères et chaque extension:
"$var"
,"$(command "$var")"
,"${array[@]}"
,"a & b"
. Utilisez'single quotes'
pour le code ou littéral$'s: 'Costs $5 US'
,ssh host 'echo "$HOSTNAME"'
. Voirhttp://mywiki.wooledge.org/Quotes
http://mywiki.wooledge.org/Arguments
http://wiki.bash-hackers.org/syntax/words
la source
termux-contact-list |jq -r '.[] | select(.name=='$1')|.number'
. Résultat:jq Compile error
jq
jq: error: syntax error, unexpected INVALID_CHARACTER (Unix shell quoting issues?)
Publiez-le ici car cela pourrait aider les autres. Dans la chaîne, il peut être nécessaire de passer les guillemets à jq. Pour faire ce qui suit avec jq:
en bash tu pourrais faire
échapper essentiellement les guillemets et les transmettre à jq
la source
Une autre façon d'accomplir cela est d'utiliser l'indicateur jq "--arg". En utilisant l'exemple d'origine:
Voir ici, où j'ai trouvé cette solution: https://github.com/stedolan/jq/issues/626
la source
Je sais que c'est un peu plus tard pour répondre, désolé. Mais cela fonctionne pour moi.
Et maintenant, je suis capable de récupérer et de transmettre le contenu de la variable à jq
Dans mon cas, j'avais besoin d'utiliser des guillemets doubles et des guillemets pour accéder à la valeur de la variable.
À votre santé.
la source
Jq a maintenant un meilleur moyen d'accéder aux variables d'environnement, vous pouvez utiliser env.EMAILI:
la source
Peu sans rapport mais je vais quand même le mettre ici, Pour d'autres raisons pratiques, les variables shell peuvent être utilisées comme -
la source