You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Bash变量替换结合jq查询始终返回null的问题排查

解决jq通过变量访问JSON数字属性返回null的问题

我来帮你搞定这个头疼的问题!你遇到的核心问题是在jq里用变量访问数字类型的对象属性时,语法用错了。直接把变量塞进引号或者用点语法都没法让jq正确识别变量值,得用jq专门的变量引用结合方括号访问的方式。

正确的脚本写法

直接给你能跑通的代码,替换掉你之前的各种Try尝试:

#!/bin/bash
chkCustomer=101
chkFile="json-simple.txt"
if [[ ! -s "${chkFile}" ]] ; then
    exit 1 ;
fi

# 这才是正确的变量访问方式
tokenCorrect=$(cat "${chkFile}" | jq -r --arg CHK "$chkCustomer" '.payload.customerData[$CHK].token')
printf "%s\n" "Correct Try Returned ${tokenCorrect}"

执行这个脚本后,你会得到和第7次硬编码一样的正确结果:

Correct Try Returned QSBQcmV2aW91cyBDb21wYW55LzEwMQ==

为什么之前的尝试都失败了?

我给你逐个分析下问题所在:

  • Try1/Try2:你把变量放在了单引号包裹的jq表达式里,shell不会解析单引号内的变量,所以jq实际拿到的是字面量"${chkCustomer}"或"$chkCustomer",而不是101,自然找不到对应的属性。
  • Try3/Try5:虽然用了--arg传递变量,但还是用了"$CHK"的写法——在jq里,变量不需要加$放在引号里,这种写法会让jq把$CHK当成字符串字面量,而不是引用你传递的变量值。
  • Try4:"env.$CHK"完全是错误的语法,jq没有这种环境变量插值的写法。
  • Try6:.payload.customerData.101.token报错是因为jq规定,数字开头的属性名不能直接用点语法访问,必须用引号(.payload.customerData."101".token)或者方括号(.payload.customerData[101].token)才行。

额外说明

如果你的属性值可能是数字或字符串类型,--arg会把变量当成字符串传递,刚好匹配JSON里的"101"字符串属性名,完美适配你的场景。如果是纯数字属性,也可以用--argjson传递数字类型的变量,不过你的场景里--arg就足够了。

内容的提问来源于stack exchange,提问作者user11282051

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 04:39:35