如何确定 URL 中的最新版本?

如何确定 URL 中的最新版本?

我试图在脚本中放置一个“函数”来安装最新版本的“TeamSpeak3”客户端并进行所有配置。

我的问题是我不知道如何制作一个函数来测试版本号部分,”数字数字数字数字“。数字范围从0到99。

例如,我得到一个具有 URL 中的值的变量:

URL=http://dl.4players.de/ts/releases/$version/TeamSpeak3-Client-linux_$arch-$version.run

这里的变量$Version,最新的是3.0.16。目前最新的网址是:

http://dl.4players.de/ts/releases/3.0.16/TeamSpeak3-Client-linux_x86-3.0.16.run

但将来当我使用该脚本时,我希望它能够自动确定最新版本,检查 URL 中的数字。

对于“拱门”我有这个代码:

# Determining the system arch
arch=$(uname -m)
case "$arch" in
x86)    arch="x86"  ;;
i?86)   arch="x86"  ;;
amd64)  arch="amd64"    ;;
x86_64) arch="x86_64"   ;;
* ) echo "Your Arch '$arch' -> Its not supported."  ;;
esac

也许是一个数组或类似的东西?有人可以帮助我实现这个想法吗?

答案1

这就是为什么您不应该使用纯 shell 脚本。相反,最好使用一些东西是为了任务,就像 uscan (这是一个 perl 脚本)一样,而不是自己做:

$ uscan --watchfile teamspeak --package TeamSpeak3 --no-download --verbose --upstream-version 3.0.16
-- In test, processing watchfile line:
   http://dl.4players.de/ts/releases/([\d\.]+)/TeamSpeak3-Client-linux_amd64-([\d\.]+).run
-- Found the following matching hrefs:
     TeamSpeak3-Client-linux_amd64-3.0.16.run (3.0.16)
Newest version on remote site is 3.0.16, local version is 3.0.16
 => Package is up to date

teampeak 文件的内容是:

version=2
http://dl.4players.de/ts/releases/([\d\.]+)/TeamSpeak3-Client-linux_amd64-([\d\.]+).run

在上面的示例中,我手动设置了最新版本的版本,如果您愿意,可以替换TeamSpeak中支持该--version参数的版本,即:

$ uscan --watchfile teamspeak --package TeamSpeak3 --no-download --verbose --upstream-version $(teamspeak --version)

它应该输出一个数值。也可以自动下载最新的运行文件,只需删除该--no-download选项即可。这样做的好处是非常非常灵活,当新版本发布时你不需要修改任何东西,也不用担心它会崩溃。

对于您的用例来说,唯一真正的限制是 uscan 不支持设置架构,但是如果您只是创建另一个文件(例如teamspeak-i386)并像这样调整 url,则可以轻松克服这种限制:

version=2
http://dl.4players.de/ts/releases/([\d\.]+)/TeamSpeak3-Client-linux_x86-([\d\.]+).run

答案2

我不确定你到底在问什么。假设您想要查找列出的最新版本http://dl.4players.de/ts/releases/, 你可以这样做:

curl -s http://dl.4players.de/ts/releases/ | \
  grep -Po '(?<=href=")[0-9]+(\.[0-9]+){2,3}(?=/")' | \
  sort -Vr | head -1

输出示例:

3.0.16

解释:

  • 请注意,列出 HTML 的目录遵循相当常规的图案:

    <tr><td valign="top"><img src="/icons/folder.gif" alt="[DIR]"></td><td><a href="3.0.0/">3.0.0/</a></td><td align="right">10-Aug-2011 16:57  </td><td align="right">  - </td><td>&nbsp;</td></tr>
    <tr><td valign="top"><img src="/icons/folder.gif" alt="[DIR]"></td><td><a href="3.0.1/">3.0.1/</a></td><td align="right">17-Nov-2011 08:43  </td><td align="right">  - </td><td>&nbsp;</td></tr>
    

    href="X.Y.Z[.A]/"所有版本文件夹链接均以、AXYZ数字创建。

  • 所以我们可以grep对于这个模式(?<=href=")[0-9]+(\.[0-9]+){2,3}(?=/"):我使用 Perl 正则表达式 ( -P)前瞻和后瞻(因此该字符串被href="和包围/",但这两个不是实际匹配的一部分)。正则表达式[0-9]+(\.[0-9]+){2,3}的意思是:

    1. 一位或多位数字:[0-9]+,后跟,
    2. 由句点和一个或多个数字 ( ) 组成的组(\.[0-9]+),重复两次或三次 ( {2,3})。
  • 然后我们进行版本sort并得到最佳结果。


通常,不应该使用正则表达式来解析 HTML。不过,我认为有时可以例外。

答案3

我将获取 URL 并从中解析版本号:

$ echo 'http://dl.4players.de/ts/releases/3.0.16/TeamSpeak3-Client-linux_x86-3.0.16.run' \
    | awk -F'_x86-' '{print $2}' | sed 's/.run//'
3.0.16

解析出版本后,您可以用来sort确定哪个版本较新。特别是sort使用它的-V开关,较新的版本有。

$ echo -e '3.0.16\n4.0.2\n1.2.3\n5.6.7\n3.0.17' | sort -V | tail -1
5.6.7

这只是一个粗略的方法,但应该向您展示如何轻松实现您想要的目标。

笔记:我的sort版本。

$ sort --version
sort (GNU coreutils) 8.21

答案4

很好用curl我可以解决Quake2最新版本

Q2VA=$(curl -s http://deponie.yamagi.org/quake2/ | grep -Po "quake2-[0-9].[0-9][0-9].tar.xz" | sort -Vr | head -1)

但现在我正在尝试使用 LibreOffice,使用以下命令:

curl -s http://www.libreoffice.org/download/download/ | grep -Po "[0-9].[0-9].[0-9]" | sort -Vr

输出 :

93276
90701
89681
72663
50227
43905
42382
42382
26302
25220
20474
18000
14907
14764
14001
13964
13903
13902
13898
13890
13884
12887
12774
07992
700,9
100,3
6/5.4
6/5.3
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.3.5
5.3.5
5.3.5
5.3.5
5.3.5
5.3.5
5.3.5
5.3.5
5.3.5
5.3.5
5.3.5
5.3.5
5.3.5
5.3.5
5.3.5
5.3.5
5.3.5
5.3.5
5.3.5
5.3.5
5.3.5
5.3.5
5.3.5
5.3.5
5.3.4
5.3.4
5.2.7
5.2.7
2.6.2
1.1.0
0,400
0,300
0A500
0A500

我如何指示仅存储在变量中的第一个值类型“Number.Number.Number”?在本例中,第一个是 5.4.0,位于第 29 行,但如果我使用像 sed 这样的东西,这可能会在将来发生变化,第 29 行拥有最新版本时并不安全。

期望输出:

5.4.0

有人可以提供一些解决方案吗?

相关内容