Eu escrevi um script para recuperar determinado valor file.json
. Funciona se eu fornecer o valor para jq select
, mas a variável parece não funcionar (ou não sei como usá-la).
#!/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
fonte
fonte
jq -r --arg var "$var" '.[$var]'
stackoverflow.com/questions/34745451/…Respostas:
Considere também passar a variável shell (EMAILID) como uma variável jq (aqui também EMAILID, para fins de ilustração):
PostScript
Para o registro, outra possibilidade seria usar a
env
função de jq para acessar variáveis de ambiente. Por exemplo, considere esta sequência de comandos bash:A saída é uma string JSON:
fonte
jq
criar corretamente o filtro usando o valor, em vez de usarbash
para criar uma string quejq
interpreta como um filtro. (Considere o que acontece se o valor deEMAILID
contém a)
.)function n2 { termux-contact-list |jq -r --arg v1 "$1" '.[] | select(.name==$v1)|.number' }
Ligando:n2 Name1
env
função de jq é alterada entre jq 1.4 e 1.5+, portanto, referências aenv.EMAILID
(no exemplo desta resposta) não funcionam em jq 1.4, portanto, recomendamos o uso da--arg EMAILID "$EMAILID"
construção se você precisar usar jq 1.4. Espero que isto ajude; levei um dia + para descobrir por mim mesmo;)--arg
serão passados como strings. Se você quiser passar dados de um tipo JSON diferente, use--argjson
, que analisará a string como JSON, por exemplo,--argjson myObj '{"a": [1, 2]}'
Resolvi esse problema escapando das aspas duplas internas
fonte
-c
É um problema de cotação, você precisa de:
Se você colocar aspas simples para delimitar a string principal, o shell interpretará
$EMAILID
literalmente."Quote Double" cada literal que contenha espaços / metacharacters e cada expansão:
"$var"
,"$(command "$var")"
,"${array[@]}"
,"a & b"
. Use'single quotes'
para o código ou literal$'s: 'Costs $5 US'
,ssh host 'echo "$HOSTNAME"'
. Consultehttp://mywiki.wooledge.org/Quotes
http://mywiki.wooledge.org/Arguments
http://wiki.bash-hackers.org/syntax/words
fonte
termux-contact-list |jq -r '.[] | select(.name=='$1')|.number'
. Resultado:jq Compile error
jq
não gosta de aspas simples:jq: error: syntax error, unexpected INVALID_CHARACTER (Unix shell quoting issues?)
Postando aqui, pois pode ajudar outras pessoas. Na string, pode ser necessário passar as aspas para jq. Para fazer o seguinte com jq:
na festa você poderia fazer
essencialmente escapando das aspas e passando para jq
fonte
Outra maneira de fazer isso é com o sinalizador jq "--arg". Usando o exemplo original:
Veja aqui, onde encontrei esta solução: https://github.com/stedolan/jq/issues/626
fonte
Eu sei que é um pouco mais tarde para responder, desculpe. Mas isso funciona para mim.
E agora posso buscar e passar o conteúdo da variável para jq
No meu caso, precisei usar aspas duplas e aspas para acessar o valor da variável.
Felicidades.
fonte
Jq agora tem uma maneira melhor de acessar as variáveis de ambiente, você pode usar env.EMAILI:
fonte
Pouco não relacionado, mas ainda vou colocá-lo aqui. Para outros fins práticos, as variáveis de shell podem ser usadas como -
fonte