He escrito un script para recuperar cierto valor file.json. Funciona si proporciono el valor a 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"
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"
json
bash
environment-variables
jq
asidd
fuente
fuente

jq -r --arg var "$var" '.[$var]'stackoverflow.com/questions/34745451/…Respuestas:
Considere también pasar la variable de shell (EMAILID) como una variable jq (aquí también EMAILID, por el bien de la ilustración):
Posdata
Para el registro, otra posibilidad sería utilizar la
envfunción de jq para acceder a las variables de entorno. Por ejemplo, considere esta secuencia de comandos de bash:La salida es una cadena JSON:
fuente
jqcrear correctamente el filtro usando el valor, en lugar de usarlobashpara crear una cadena que sejqinterprete como un filtro. (Considere lo que sucede si el valor deEMAILIDcontiene a).)function n2 { termux-contact-list |jq -r --arg v1 "$1" '.[] | select(.name==$v1)|.number' }Llamando:n2 Name1envfunción de jq se cambia entre jq 1.4 y 1.5+, por lo que las referencias aenv.EMAILID(en el ejemplo de esta respuesta) no funcionan en jq 1.4, por lo que se recomienda usar la--arg EMAILID "$EMAILID"construcción si necesita usar jq 1.4. Espero que esto ayude; me tomó un día + para resolver esto por mí mismo;)--argse pasarán como cadenas. Si desea pasar datos de un tipo JSON diferente, use--argjson, que analizará la cadena como JSON, por ejemplo,--argjson myObj '{"a": [1, 2]}'Resolví este problema escapando de las comillas dobles internas
fuente
-cEs un problema de cotización, necesita:
Si pone comillas simples para delimitar la cadena principal, el shell toma
$EMAILIDliteralmente."Cita doble" cada literal que contiene espacios / metacaracteres y cada expansión:
"$var","$(command "$var")","${array[@]}","a & b". Utilizar'single quotes'para el código o literal$'s: 'Costs $5 US',ssh host 'echo "$HOSTNAME"'. Verhttp://mywiki.wooledge.org/Quotes
http://mywiki.wooledge.org/Arguments
http://wiki.bash-hackers.org/syntax/words
fuente
termux-contact-list |jq -r '.[] | select(.name=='$1')|.number'. Resultado:jq Compile errorjqno le gustan las comillas simples:jq: error: syntax error, unexpected INVALID_CHARACTER (Unix shell quoting issues?)Publicarlo aquí ya que podría ayudar a otros. En cadena, puede ser necesario pasar las comillas a jq. Para hacer lo siguiente con jq:
en bash podrías hacer
esencialmente escapando de las comillas y pasándolo a jq
fuente
Otra forma de lograr esto es con la bandera jq "--arg". Usando el ejemplo original:
Vea aquí, que es donde encontré esta solución: https://github.com/stedolan/jq/issues/626
fuente
Sé que es un poco más tarde para responder, lo siento. Pero eso funciona para mí.
Y ahora puedo buscar y pasar el contenido de la variable a jq
En mi caso, necesitaba usar comillas dobles y comillas para acceder al valor de la variable.
Salud.
fuente
Jq ahora tiene una mejor manera de acceder a las variables de entorno, puede usar env.EMAILI:
fuente
Poco relacionado, pero lo pondré aquí, para otros propósitos prácticos, las variables de shell se pueden usar como:
fuente