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"
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')
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]"
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
J'ai résolu ce problème en évitant les guillemets intérieurs
projectID=$(cat file.json | jq -r ".resource[] | select(.username==\"$EMAILID\") | .id")
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
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é.