Passer la variable bash à jq select

j'ai écrit un script pour récupérer la valeur de file.json. Cela fonctionne si je fournis 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=="myemail@hotmail.com") | .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"
22
demandé sur Benjamin W. 2016-10-13 20:28:55

4 réponses

Envisager également de passage dans la variable d'environnement (EMAILID) comme jq variable (ici aussi EMAILID, pour le bien de l'illustration):

   projectID=$(cat file.json | jq -r --arg EMAILID "$EMAILID" '.resource[]
                               | select(.username==$EMAILID) | .id')

Postscript

Pour l'enregistrement, une autre possibilité serait d'utiliser jq env fonction pour accéder aux variables d'environnement. Par exemple, considérez cette séquence de commandes de bash:

EMAILID=foo@bar.com  # not exported
EMAILID="$EMAILID" jq -n 'env.EMAILID'

la sortie est une chaîne JSON:

"foo@bar.com"
42
répondu peak 2017-12-29 12:57:48

C'est une citation problème, vous avez besoin de :

projectID=$(
  cat file.json | jq -r ".resource[] | select(.username=='$EMAILID') | .id"
)

Si vous mettez les guillemets simples pour délimiter la chaîne principale, le shell prend $EMAILID littéralement.

"double quote" chaque littéral qui contient des espaces / metacharacters et tous les extension: "$var", "$(command "$var")","${array[@]}","a & b". Utilisez 'single quotes' pour le code ou littéral $'s: 'Costs US',ssh host 'echo "$HOSTNAME"'. See

http://mywiki.wooledge.org/Quotes

http://mywiki.wooledge.org/Arguments

http://wiki.bash-hackers.org/syntax/words

6
répondu Gilles Quenot 2016-10-13 17:30:50

j'ai résolu ce problème en échappant aux doubles citations internes

projectID=$(cat file.json | jq -r ".resource[] | select(.username==\"$EMAILID\") | .id")
4
répondu asidd 2016-10-13 17:41:21

une autre façon d'accomplir ceci est avec le drapeau jq "--arg". À l'aide de l'exemple:

#!/bin/sh

#this works ***
projectID=$(cat file.json | jq -r '.resource[] | 
select(.username=="myemail@hotmail.com") | .id')
echo "$projectID"

EMAILID=myemail@hotmail.com

# Use --arg to pass the variable to jq. This should work:
projectID=$(cat file.json | jq --arg EMAILID $EMAILID -r '.resource[] 
| select(.username=="$EMAILID") | .id')
echo "$projectID"

voir ici, qui est où j'ai trouvé cette solution: https://github.com/stedolan/jq/issues/626

0
répondu Andrew Lockhart 2017-11-21 23:53:49