Windows下jq使用负索引解析JSON不生效 如何获取数组最后一项
问题根源
Windows的CMD、PowerShell与Linux Shell的参数解析逻辑存在差异:
- Linux环境下,引号包裹的jq过滤器会被原样传入程序,
[-1]负索引语法可被jq正常识别 - Windows命令解释器会对参数中的方括号
[]做特殊处理:CMD会把方括号识别为文件名通配符,PowerShell会对传入参数做额外类型转换,最终jq收到的过滤器参数和预期不符,解析返回null。另外Windows环境不识别单引号作为字符串边界,原命令中header参数用单引号包裹也可能导致传参异常。
解决方案
通用无转义方案(推荐,全平台兼容)
直接使用jq内置的last过滤器取数组最后一个元素,完全避开所有特殊字符转义问题,同一条命令在Windows、Linux、macOS下均可直接运行:
curl.exe -s --location --request GET "http://myhost:8080/api/v2/streams/stream/snapshots?idType=byName&name=mystream" --header "Accept:application/json" --user user1:xyz | jq ".snapshotsForStream | last.id"
执行后可直接返回最新快照ID24274。
负索引写法适配(不推荐,需对应环境转义)
如果要保留[-1]的索引写法,需要根据当前使用的命令行做对应转义:
- 使用CMD时:将过滤器用双引号包裹,同时给方括号加CMD转义符
^,写法为jq ".snapshotsForStream[^-1].id" - 使用PowerShell时:在jq参数前加停止解析标记
--%,阻断PowerShell的参数解析逻辑,写法为jq --% '.snapshotsForStream[-1].id'
这类写法需要匹配当前shell调整规则,切换运行环境就可能失效,优先使用last的写法更稳妥。
内容的提问来源于stack exchange,提问作者Amit Kumar Jain
相关产品推荐
相关产品推荐

