Passando a variável bash para jq select

Eu escrevi um script para recuperar determinado valor do file.json . Ele funciona se eu fornecer o valor para jq select , mas a variável não parece funcionar (ou eu não sei como usá-lo).

 #!/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 também passar a variável shell (EMAILID) como uma variável jq (aqui também EMAILID, para fins de ilustração):

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

Postscript

Para o registro, outra possibilidade seria usar a function env do jq para acessar variables ​​de ambiente. Por exemplo, considere esta sequência de comandos bash:

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

A saída é uma string JSON:

 "foo@bar.com" 

É uma questão de cotação, você precisa:

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

Se você colocar aspas simples para delimitar a string principal, o shell $EMAILID literalmente.

“Aspas duplas” a cada literal que contenha espaços / metacaracteres e todas as expansões: "$var" , "$(command "$var")" , "${array[@]}" , "a & b" . Use 'single quotes' para código ou literal $'s: 'Costs $5 US' , ssh host 'echo "$HOSTNAME"' . Vejo
http://mywiki.wooledge.org/Quotes
http://mywiki.wooledge.org/Arguments
http://wiki.bash-hackers.org/syntax/words

Eu resolvi esse problema escapando das aspas duplas internas

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

Outra maneira de conseguir isso é com o sinalizador “–arg” do jq. Usando o exemplo 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" 

Veja aqui, que é onde encontrei esta solução: https://github.com/stedolan/jq/issues/626