从JSON响应中获取最新版本发布字段



我想自动下载AdoptiumJDK的最新LTS。所以我找到了一个好的清单作为开始。

我只想过滤1.17的稳定版本,所以我尝试了:

curl -s https://raw.githubusercontent.com/coursier/jvm-index/master/index.json 
| jq -r '.linux.amd64."jdk@adoptium-jre" 
| to_entries[] 
| .[] 
| select(match("1.17.[0-9]+.[0-9]+$"))'

给出:

1.17.0.1
1.17.0.2
1.17.0.3
1.17.0.4

但我想要最新(最高数量(的版本,并且我想要此版本的URL。

curl -s https://raw.githubusercontent.com/coursier/jvm-index/master/index.json 
| jq -r '.linux.amd64."jdk@adoptium-jre" 
| to_entries[] 
| .[] 
| select(match("1.17.[0-9]+.[0-9]+$"))'   
| sort -n 
| tail -1

但这并不优雅,我必须通过bash解析这个输出并进行新的查找。

我如何获得当前最新版本1.17的URL(应该给出"tgz+https://github.com/adoptium/temurin17-binaries/releases/download/jdk-17.0.4%2B8/OpenJDK17U-jre_x64_linux_hotspot_17.0.4_8.tar.gz"(

您可以在应用正则表达式的过程中获取键/值对,而不是单独获取版本字段,然后对版本字段执行sort_by。记住转义要作为文字处理的.字符,或者使用startswith("1.17.")

.linux.amd64."jdk@adoptium-jre" 
| to_entries 
| map(select(.key | test("1\.17\.[0-9]+\.[0-9]+$"))) 
| sort_by(.key | split(".") | map(tonumber)) 
| last.value

这里的关键部分是sort_by表达式,它告诉jq将版本字段拆分为组成字符串,然后转换为数字,即map(tonumber),然后对其执行排序操作

通过该操作,列表[1, 17, 0, 4]预计是其余记录中最高的。last内建函数获取元素列表中的最后一条记录。

jqplay演示

尝试max_by

.linux.amd64."jdk@adoptium-jre"
| to_entries
| map(select(.key | startswith("1.17.")))
| max_by(.key)
| .value

相关内容

最新更新