利用 GitHub API 获取最新 Releases 的版本号

前言

本文以 iina/iina: The modern video player for macOS 为例,展示利用 GitHub API 获取 Repo 中最新 Releases 的版本号。

代码

1
wget -qO- -t1 -T2 "https://api.github.com/repos/iina/iina/releases/latest" | grep "tag_name" | head -n 1 | awk -F ":" '{print $2}' | sed 's/\"//g;s/,//g;s/ //g'

代码解释

主字段

https://api.github.com/repos/iina/iina/releases/latest 这里用的是 GitHub 的官方 API,格式为 https://api.github.com/repos/{项目名}/releases/latest
打开上述链接后,可见包含下述字段的内容:

1
2
3
4
5
6
"html_url": "https://github.com/lhc70000/iina/releases/tag/v0.0.15.1",
"id": 10774475,
"node_id": "MDc6UmVsZWFzZTEwNzc0NDc1",
"tag_name": "v0.0.15.1",
"target_commitish": "0.0.15.1",
"name": "v0.0.15.1",

那么这里的tag_name就是我们所需要的东西啦

wget 参数

wget -qO- -t1 -T2,在这里,我们使用了 4 个参数,分别是q,O-,t1,T2

  1. -q: q 就是 quiet 的意思了,没有该参数将会显示从请求到输出全过程的所有内容,这肯定不是我们想要的。
  2. -O-: -O是指把文档写入文件中,而-O-是将内容写入标准输出,而不保存为文件。(注:这里是大写英文字母 O (Out),不是数字 0)
  3. -t1,-T2: 前者是设定最大尝试链接次数为 1 次,后者是设定响应超时的秒数为 2 秒,两者可以防止失败后反复获取,导致后续脚本无法执行。

筛选参数

  1. grep "tag_name": grep 是 Linux 一个强大的文本搜索工具,在本代码中输出 tag_name 所在行,即输出"tag_name": "v0.0.15.1",
  2. head -n 1: head -n用于显示输出的行数,考虑到某些项目可能存在多个不同版本的 tag_name,这里我们只要第一个。
  3. awk -F ":" '{print $2}': awk 主要用于文本分析,在这里指定:为分隔符,将该行切分成多列,并输出第二列。于是我们得到了(空格)"v0.0.15.1",
  4. sed 's/\"//g;s/,//g;s/ //g': 在这里 sed 用于数据查找替换,如sed 's/要被取代的字串/新的字串/g' ,因此本段命令可分为 3 个,以分号分隔。s/\"//g即将引号删除(反斜杠是为了防止引号被转义),以此类推,最终留下我们需要的内容:v0.0.15.1