如何在jq命令中传入变量动态获取JSON文件指定字段值
Shell中jq动态传参匹配JSON字段的正确写法
原有写法的错误点
- 读取
generic.category字段时未加-r参数,jq默认输出带JSON双引号(比如输出"two"而非two),作为路径参数时会匹配失败 - 动态字段拼接语法错误:对象下标取值后连接下级字段缺少
.分隔,多余的通配符*也会干扰路径解析 - 传变量时未给shell变量加引号,若变量值含空格等特殊字符会触发解析错误
- 冗余使用
cat管道传文件内容,jq本身支持直接读取目标文件
可直接运行的修正代码
# 加-r参数输出原始无引号字符串 stack=$(jq -r '.generic.category' profiles.json) # 通过--arg安全传入shell变量,按对象下标语法动态匹配路径 email=$(jq -r --arg target_stack "$stack" '.central[$target_stack].email' profiles.json) echo "$email" password=$(jq -r --arg target_stack "$stack" '.central[$target_stack].password' profiles.json) echo "$password"
语法说明
jq -r:启用原始输出模式,字符串类结果直接输出纯文本,不包裹JSON格式要求的双引号--arg <变量名> <值>:jq官方支持的外部变量传入方式,自动处理特殊字符转义,比手动字符串拼接更安全.central[$target_stack].email:路径解析逻辑为取根节点下的central对象 → 以传入的变量值为key匹配对应的子对象 → 取子对象下的email字段值,完全匹配给定的profiles.json结构
当配置中category值为two时,运行代码会正确输出:
xyz@gmail.com 2222
内容的提问来源于stack exchange,提问作者RR HS
相关产品推荐
相关产品推荐

