我试图在脚本中放置一个“函数”来安装最新版本的“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> </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> </td></tr>
href="X.Y.Z[.A]/"
所有版本文件夹链接均以、A
、X
、Y
和Z
数字创建。所以我们可以
grep
对于这个模式(?<=href=")[0-9]+(\.[0-9]+){2,3}(?=/")
:我使用 Perl 正则表达式 (-P
)前瞻和后瞻(因此该字符串被href="
和包围/"
,但这两个不是实际匹配的一部分)。正则表达式[0-9]+(\.[0-9]+){2,3}
的意思是:- 一位或多位数字:
[0-9]+
,后跟, - 由句点和一个或多个数字 ( ) 组成的组
(\.[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
有人可以提供一些解决方案吗?