我正在使用JQ
从测验数据库中获取一些 JSON,并且我想解析结果。我正在尝试将结果数组保存在 Bash 中,如下所示,但格式是 JavaScript/Python 中使用的带有方括号而不是 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 )
答案的示例如下:
[ "Excitement", "Aggression", "Exhaustion" ]
由于格式错误,永远不会将正确答案推送到数组中。
如何转换上述格式的数组,以便在我的脚本中将其解释为数组。
输出示例curl
(这不是硬编码,问题和答案每次都不同):
{
"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"
]
}
]
}
我会
jq
逐行输出结果。然后使用 bashmapfile
命令将行读入数组对于不正确的答案,由于 bash 没有多维数组,我可以
jq
将不正确答案的数组输出为 CSV:然后:
文档:
假设您正在与用户交互:
请记住,内部运算符
[[...]]
不是字符串相等运算符,它是模式匹配运算符。==
扩展@ RomanPerekhrest的答案(现在就去投票吧):
然后,你可以使用这样的东西
根据既定目标“我希望 bash 数组包含
correct_answer
并且incorrect_answers
”您希望获得一个组合值数组。无需运行 2 个不同
jq
的命令,整个组合序列可以由单个jq
表达式组成:对于单字数组项:
结果:
要处理带有空格的项目(如 中的那些
.results[1]
),请使用以下方法readarray
和@json
选项:结果:
因为这个问题在我的脑海中提出,一个运行游戏的小脚本:
假设您要遍历
results
数组中的每个元素,并将每个元素的correct_answer
值分配给 shell 变量,并将incorrect_answers
值分配给数组变量 inbash
:鉴于问题中的数据,这将输出
在每次迭代中,该
jq
工具用于提取results
JSON 文档中数组的特定元素。它将数据格式化为一组 shell 分配。例如,当$i
为 1 时,它将创建语句然后,shell 将评估这些语句,从而创建变量
correct_answer
和数组incorrect_answers
。