Estou usando JQ
para buscar algum JSON de um banco de dados de quiz e quero analisar os resultados. Estou tentando salvar uma matriz resultante no Bash, conforme mostrado abaixo, mas o formato é usado em JavaScript/Python com colchetes em vez do estilo Bash.
quiz=$(curl -s https://opentdb.com/api.php?amount=3)
answers=$(echo $quiz | jq '[ .results][0][0].incorrect_answers')
correct=$(echo $quiz | jq '[ .results][0][0].correct_answer')
answers+=( $correct )
Um exemplo de como as respostas se parecem está abaixo:
[ "Excitement", "Aggression", "Exhaustion" ]
A resposta correta nunca é enviada para a matriz devido ao formato errado.
Como posso converter um array do formato mostrado acima para que seja interpretado no meu script como um array.
Exemplo de saída de curl
(isso não é codificado, pergunta e resposta são sempre diferentes) :
{
"response_code": 0,
"results": [
{
"category": "Entertainment: Television",
"type": "multiple",
"difficulty": "easy",
"question": "Which company has exclusive rights to air episodes of the "The Grand Tour"?",
"correct_answer": "Amazon",
"incorrect_answers": [
"Netflix",
"BBC",
"CCTV"
]
},
{
"category": "Celebrities",
"type": "multiple",
"difficulty": "medium",
"question": "How much weight did Chris Pratt lose for his role as Star-Lord in "Guardians of the Galaxy"?",
"correct_answer": "60 lbs",
"incorrect_answers": [
"30 lbs",
"50 lbs",
"70 lbs"
]
},
{
"category": "Animals",
"type": "boolean",
"difficulty": "easy",
"question": "The Killer Whale is considered a type of dolphin.",
"correct_answer": "True",
"incorrect_answers": [
"False"
]
}
]
}
Eu conseguiria
jq
produzir os resultados em linha. Em seguida, use o comando bashmapfile
para ler as linhas em uma matrizPara as respostas incorretas, como o bash não possui matrizes multidimensionais, eu conseguiria gerar
jq
a matriz de respostas incorretas como CSV:Então:
Documentação:
Supondo que você esteja interagindo com o usuário:
Tenha em mente que dentro
[[...]]
do==
operador não há um operador de igualdade de string, é um operador de correspondência de padrões .Estendendo a resposta de @ RomanPerekhrest (vote agora):
Então, você pode usar algo assim
De acordo com o objetivo declarado "Eu quero que o array bash inclua
correct_answer
eincorrect_answers
" você espera obter um array de valores combinados.Não há necessidade de executar 2
jq
comandos diferentes, toda a sequência combinada pode ser composta com uma únicajq
expressão:Para itens de matriz de palavra única :
Resultados:
Para lidar com itens com espaços (como aqueles em
.results[1]
) use a seguinte abordagem comreadarray
e@json
opção:Resultados:
Como essa pergunta está alojada na minha cabeça, um pequeno script para rodar o jogo:
Supondo que você queira iterar sobre cada elemento na
results
matriz e, para cada um, atribuir ocorrect_answer
valor a uma variável de shell e osincorrect_answers
valores a uma variável de matriz embash
:Dados os dados da pergunta, isso resultaria
Em cada iteração, a
jq
ferramenta é usada para extrair um elemento específico daresults
matriz no documento JSON. Ele formata os dados como um conjunto de atribuições de shell. Por exemplo, quando$i
é 1, ele criaria as instruçõesO shell então avaliaria essas instruções, o que criaria a variável
correct_answer
e o arrayincorrect_answers
.