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
相关产品推荐
相关产品推荐

