ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

使用 jq 在 Bash 中处理 JSON:从 API 调用到实战脚本

使用 jq 在 Bash 中处理 JSON:从 API 调用到实战脚本 使用 jq 在 Bash 中处理 JSON从 API 调用到实战脚本【免费下载链接】introduction-to-bash-scriptingFree Introduction to Bash Scripting eBook项目地址: https://gitcode.com/GitHub_Trending/in/introduction-to-bash-scriptingjq是一款轻量、灵活的命令行 JSON 处理器用可移植 C 语言编写、零运行时依赖是 Bash 脚本中解析 JSON 输出的利器。本文以Introduction to Bash Scripting开源电子书ebook/en/content/018-working-with-json-in-bash-using-jq.md为基础围绕 QuizAPI 的真实 REST API 场景完整讲解 jq 的安装、管道解析、数组索引与字段提取并带你写出一个可复用的交互式 Bash JSON 脚本读完即可在终端和脚本中自如处理任何 REST API 的 JSON 响应。为什么用 jq 处理 Bash 中的 JSON在现代 SysOps、DevOps 与日常开发工作中REST API 返回的几乎都是 JSON 数据。Bash 本身并没有内置的 JSON 解析能力而curl拉回来的原始 JSON 通常是一大串难以阅读的压缩文本。jq恰好解决了这个问题它是命令行 JSON 处理器天生适合与管道pipe配合把curl的输出直接送入jq格式化或过滤用可移植 C 编写零运行时依赖只需下载单个二进制或用系统包管理器一条命令即可安装支持格式化、着色、索引访问、字段提取、过滤、变换等丰富操作语法简洁学习成本低。在本书的章节体系中本章建立在前面章节的变量ebook/en/content/004-bash-variables.md、函数ebook/en/content/012-bash-functions.md、重定向与管道ebook/en/content/023-bash-redirection.md知识之上是用 Bash 对接真实 REST API的实用范例。规划脚本选择演示 API为了让示例真实可运行本书选用 QuizAPI 这个返回简单 JSON 输出的外部 REST API 作为演示对象API 地址https://quizapi.io/免费 API Key 获取地址https://quizapi.io/clientarea/settings/tokenQuizAPI 对开发者免费你只需注册并生成一个 Token 即可跟随本文操作提示后续示例中的API_KEY均需替换为你自己申请到的真实 Key。你也可以使用 QuizAPI URL Generator 生成更定制化的查询参数。安装 jqjq 的安装方式因操作系统而异最直接的方式是使用各系统的包管理器Ubuntu/Debiansudo apt-get install jqFedorasudo dnf install jqopenSUSEsudo zypper install jqArchsudo pacman -S jqmacOSHomebrewbrew install jqmacOSMacPortsport install jq其他操作系统可参考 jq 官方下载页jqlang.org/download选择对应的预编译二进制或源码包。安装完成后用以下命令验证安装并查看当前版本jq --version用 jq 格式化解析 JSON 输出安装好 jq 并拿到 QuizAPI 的 API Key 后就可以直接在终端中解析 QuizAPI 的 JSON 输出了。首先把 API Key 存入一个变量API_KEYYOUR_API_KEY_HERE然后使用curl请求 QuizAPI 的一个端点curl https://quizapi.io/api/v1/questions?apiKey${API_KEY}limit10这里的${API_KEY}使用了变量插值。如 Bash Variables 章节所述变量引用建议加上双引号并用花括号包裹以避免分词word splitting和通配符展开带来的意外问题。此时终端会打印一长串未经格式化的原始 JSON可读性很差。借助管道把curl的输出直接交给jqcurl https://quizapi.io/api/v1/questions?apiKey${API_KEY}limit10 | jq注意命令结尾的| jq。jq会自动对 JSON 进行缩进格式化并加上颜色高亮输出立刻变得清晰易读。这正是管道pipe机制的经典应用如 Redirection in Bash 章节所述管道用|把前一个命令的 STDOUT 直接作为后一个命令的 STDIN 输入从而把两个命令无缝串联起来。用索引获取数组的第一个元素QuizAPI 的/questions端点返回的是一个 JSON 数组。如果只想查看数组中的第一个元素可以用.[0]指定索引jq .[0]与curl组合后的完整命令为curl https://quizapi.io/api/v1/questions?apiKey${API_KEY}limit10 | jq .[0]执行后终端只输出数组的第一个元素即第一道题目及其全部字段。.[0]中的方括号语法是 jq 访问数组元素的方式0表示从 0 开始的第一个下标与大多数编程语言的数组索引习惯一致。只提取指定字段的值很多时候你并不需要整个 JSON 对象而只想取出某个 key 对应的值。以 QuizAPI 为例它返回的每个元素包含题目question、答案answers、题目描述description等大量字段如果只想拿到所有题目而不要其他信息可以这样写jq .[].question这里需要拆开理解.[]遍历数组中的每一个元素。因为 QuizAPI 返回的是数组用.[]告诉 jq 对数组中的每个元素分别处理.question取出当前元素的question字段值。两者连起来就是取出数组中每个元素的 question 字段。执行后终端只打印出题目文本其余字段全部被过滤掉这正是 jq 在数据处理管道中的核心价值解构嵌套结构、按需提取字段。jq 过滤表达式速查表达式作用jq格式化并着色整个 JSONjq .[0]取出数组第一个元素jq .[]遍历数组所有元素jq .field取出对象的某个字段jq .[].field取出数组中每个元素的某个字段jq .[0].field取出数组第一个元素的某个字段jq .answers.answer_a访问嵌套对象多级字段在 Bash 脚本中综合运用 jq掌握了 jq 的基本操作后把它们组合进一个完整的 Bash 脚本。下面的脚本完成以下任务只取返回结果中的第一道题目取出该题的所有答案选项将各答案分别赋给独立变量在终端打印题目和答案。提示运行前请务必将API_KEY替换为你真实的 QuizAPI Key。#!/bin/bash ## # 调用 QuizAPI 并把输出存入变量 ## output$(curl https://quizapi.io/api/v1/questions?apiKeyAPI_KEYlimit10 2/dev/null) ## # 只保留第一道题目 ## output$(echo $output | jq .[0]) ## # 取出题目文本 ## question$(echo $output | jq .question) ## # 取出四个答案选项 ## answer_a$(echo $output | jq .answers.answer_a) answer_b$(echo $output | jq .answers.answer_b) answer_c$(echo $output | jq .answers.answer_c) answer_d$(echo $output | jq .answers.answer_d) ## # 打印题目与答案 ## echo Question: ${question} A) ${answer_a} B) ${answer_b} C) ${answer_c} D) ${answer_d} 脚本要点逐段解析1. 命令替换Command Substitution获取 API 响应output$(curl https://quizapi.io/api/v1/questions?apiKeyAPI_KEYlimit10 2/dev/null)$(...)是 Bash 的命令替换语法先执行括号内的命令再把命令的 STDOUT 作为字符串赋给output变量。2/dev/null把 STDERR 重定向到/dev/null丢弃——如 Redirection in Bash 章节所述2重定向错误流而/dev/null是只进不出的伪设备适合在脚本中静默忽略不必要的错误提示例如 curl 的进度信息或告警。2. 多次管道过滤逐层缩小数据output$(echo $output | jq .[0]) question$(echo $output | jq .question)第一次过滤用jq .[0]把整个数组缩减为第一道题目之后的每次提取都用echo $output | jq ...从该题目对象中取出所需字段。这种每次提取、重新赋值的写法直白易懂方便调试每一步的中间结果在生产脚本中也可以一次性用jq -r .[0] | .question之类更紧凑的写法但分步方式更利于学习与排错。3. 嵌套字段访问answer_a$(echo $output | jq .answers.answer_a)answers本身是一个嵌套对象jq .answers.answer_a用点号链式访问多级字段先取answers对象再取其中的answer_a字段。四个答案选项分别赋给answer_a~answer_d四个变量。4. 输出变量引用echo Question: ${question} A) ${answer_a} ... 双引号包裹的echo中${question}、${answer_a}等会被展开为前面 jq 提取的字段值。按照 Bash Variables 的最佳实践变量引用一律使用双引号与花括号避免值中的空格被分词破坏。运行脚本即可在终端看到类似如下的输出Question: 以下哪个命令用于查看当前目录内容 A) ls B) cd C) pwd D) cat更进一步把脚本变成交互式测验基础脚本已经能自动获取题目和答案还可以继续增强让它变成真正可选答案的交互式工具读取用户输入、判断对错、循环出题。本书 Creating an interactive menu in Bash 章节已经演示了如何用read读取用户输入并用case语句根据输入分支执行不同函数——同样的模式完全可以叠加在本章的 jq 脚本之上#!/bin/bash output$(curl https://quizapi.io/api/v1/questions?apiKeyAPI_KEYlimit1 2/dev/null) question$(echo $output | jq .[0].question) answer_a$(echo $output | jq -r .[0].answers.answer_a) answer_b$(echo $output | jq -r .[0].answers.answer_b) answer_c$(echo $output | jq -r .[0].answers.answer_c) answer_d$(echo $output | jq -r .[0].answers.answer_d) echo -e \n$question\n echo 1) $answer_a echo 2) $answer_b echo 3) $answer_c echo 4) $answer_d echo read -p 你的选择 (1-4): choice case $choice in 1) echo 你选择了 A ;; 2) echo 你选择了 B ;; 3) echo 你选择了 C ;; 4) echo 你选择了 D ;; *) echo 无效选项 ;; esac这里的jq -r选项表示输出原始字符串raw string去掉 JSON 字符串自带的双引号更适合直接展示给用户read -p提示输入并把结果存入变量case则根据选择执行对应分支。结合本书其他章节的进阶用法jq 在本电子书的后续实战章节中还会反复出现例如Working with Cloudflare API with Bash调用 Cloudflare API 时同样用 curl jq 提取 DNS 记录、缓存状态等 JSON 字段BASH 日志解析脚本配合 awk、sort、uniq 等文本工具处理日志与 jq 的提取-聚合思路一脉相承。这些章节的共同模式是curl 获取数据 → jq 提取字段 → Bash 变量承载结果 → 循环/函数组织逻辑掌握 jq 就等于打通了 Bash 与任意 JSON API 之间的最后一公里。结论jq是一个功能强大的命令行工具它让你可以直接在 Bash 终端中处理和解析 JSON无需引入 Python、Node.js 等额外运行时。配合 curl 与管道你可以轻松地在 Bash 中对接各类 REST API格式化响应、按索引取值、按字段过滤、嵌套访问再结合命令替换、变量、函数与 case 语句就能快速构建出真实的自动化脚本。更多细节可查阅 jq 官方手册jqlang.github.io/jq/manual了解map、select、length、-c、--arg等进阶特性QuizAPI 的完整接口文档则可在其官网 docs 中查看。完整的 Bash 基础知识体系可继续阅读本书的其他章节例如 Writing your first Bash script 与 Creating custom bash commands将本节学到的 jq 能力应用到更复杂的自动化场景中。【免费下载链接】introduction-to-bash-scriptingFree Introduction to Bash Scripting eBook项目地址: https://gitcode.com/GitHub_Trending/in/introduction-to-bash-scripting创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表