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:
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")