Pasando bash variable a jq select

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=="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" 

Considere también pasar la variable de shell (EMAILID) como una variable jq (aquí también EMAILID, por el bien 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 usar la función env de jq para acceder a variables de entorno. Por ejemplo, considere esta secuencia de comandos bash:

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

La salida es una cadena JSON:

 "foo@bar.com" 

Es un problema de cotización, necesitas:

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

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

“Doble cita” cada literal que contiene espacios / metacaracteres y cada expansión: "$var" , "$(command "$var")" , "${array[@]}" , "a & b" . Use 'single quotes' para el código o 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

Resolví este problema escapando de las comillas dobles internas

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

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=="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" 

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