web-dev-qa-db-fra.com

Passer la variable bash à jq select

J'ai écrit un script pour récupérer une certaine valeur de 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"

[email protected]

#this does not work *** no value is printed
projectID=$(cat file.json | jq -r '.resource[] | select(.username=="$EMAILID") | .id')
echo "$projectID"
63
asidd

Envisagez également de passer la variable Shell (EMAILID) en tant que variable jq (ici aussi EMAILID, par souci d’illustration):

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

Postscript

Pour mémoire, une autre possibilité consisterait à utiliser la fonction env de jq pour accéder aux variables d'environnement. Par exemple, considérons cette séquence de commandes bash:

[email protected]  # not exported
EMAILID="$EMAILID" jq -n 'env.EMAILID'

La sortie est une chaîne JSON:

"[email protected]"
102
peak

C'est un problème de devis, il vous faut:

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

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

"Double quote" chaque littéral contenant des espaces/métacaractères et tous les extensions: "$var", "$(command "$var")", "${array[@]}" , "a & b". Utilisez 'single quotes' pour le code ou le littéral $'s: 'Costs $5 US', ssh Host 'echo "$HOSTNAME"'. Voir
http://mywiki.wooledge.org/Quotes
http://mywiki.wooledge.org/Arguments
http://wiki.bash-hackers.org/syntax/words

12
Gilles Quenot

J'ai résolu ce problème en évitant les guillemets intérieurs

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

Une autre façon de faire est d'utiliser le drapeau jq "--arg". En utilisant l'exemple original:

#!/bin/sh

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

[email protected]

# 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 où je trouve cette solution: https://github.com/stedolan/jq/issues/626

2
Andrew Lockhart

Je sais que c'est un peu plus tard pour répondre, désolé. Mais ça marche pour moi.

export K8S_public_load_balancer_url="$(kubectl get services -n ${TENANT}-production -o wide | grep "ingress-nginx-internal$" | awk '{print $4}')"

Et maintenant je suis capable d'extraire et de transmettre le contenu de la variable à jq

export TF_VAR_public_load_balancer_url="$(aws elbv2 describe-load-balancers --region eu-west-1 | jq -r '.LoadBalancers[] | select (.DNSName == "'$K8S_public_load_balancer_url'") | .LoadBalancerArn')"

Dans mon cas, je devais utiliser les guillemets doubles et les guillemets pour accéder à la valeur de la variable.

À votre santé.

0
Rodrigo Andrade