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
env
funció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
jq
crear correctamente el filtro usando el valor, en lugar de usarlobash
para crear una cadena que sejq
interprete como un filtro. (Considere lo que sucede si el valor deEMAILID
contiene a)
.)function n2 { termux-contact-list |jq -r --arg v1 "$1" '.[] | select(.name==$v1)|.number' }
Llamando:n2 Name1
env
funció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;)--arg
se 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
-c
Es un problema de cotización, necesita:
Si pone comillas simples para delimitar la cadena principal, el shell toma
$EMAILID
literalmente."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 error
jq
no 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