from filters example array argjson json bash environment-variables jq

json - filters - Pasando la variable bash a jq select



jq parsing json (5)

Considere también pasar la variable de shell (EMAILID) como una variable jq (aquí también EMAILID, en aras de la ilustración):

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

Posdata

Para el registro, otra posibilidad sería utilizar la función env de jq para acceder a las variables de entorno. Por ejemplo, considere esta secuencia de comandos bash:

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

El resultado es una cadena JSON:

"[email protected]"

He escrito un script para recuperar cierto valor de file.json . Funciona si proporciono el valor para jq select , pero la variable no parece funcionar (o no sé cómo usarla).

#!/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"


Es un problema de presupuesto, necesitas:

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

Si pone comillas simples para delimitar la cadena principal, el shell toma $EMAILID literalmente.

"Comillas dobles" cada literal que contiene espacios / metacaracteres y cada expansión: "$var" , "$(command "$var")" , "${array[@]}" , "a & b" . Use ''single quotes'' para código o $''s: ''Costs $5 US'' literales $''s: ''Costs $5 US'' , ssh host ''echo "$HOSTNAME"'' . Ver
http://mywiki.wooledge.org/Quotes
http://mywiki.wooledge.org/Arguments
http://wiki.bash-hackers.org/syntax/words


Lo sé, es un poco más tarde para responder, lo siento. Pero eso funciona para mí.

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

Y ahora puedo obtener y pasar el contenido de la variable a 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'')"

En mi caso, necesitaba usar comillas dobles y comillas para acceder al valor variable.

Aclamaciones.


Otra forma de lograr esto es con la bandera jq "--arg". Usando el ejemplo 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"

Vea aquí, que es donde encontré esta solución: https://github.com/stedolan/jq/issues/626


Resolví este problema escapando de las comillas dobles internas

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