![通过脚本安装最新版本的 dotnet-sdk](https://linux22.com/image/1173983/%E9%80%9A%E8%BF%87%E8%84%9A%E6%9C%AC%E5%AE%89%E8%A3%85%E6%9C%80%E6%96%B0%E7%89%88%E6%9C%AC%E7%9A%84%20dotnet-sdk.png)
我正在编写安装程序脚本,需要安装 dotnet-sdk。我想安装最新版本,即 3.1 或将来的 3.2 或任何版本。现在我发现 apt-get 中有两个版本:
user@NUC7CJYH:~$ apt search dotnet-sdk-3
Sorting... Done
Full Text Search... Done
dotnet-sdk-3.0/now 3.0.103-1 amd64 [installed,local]
Microsoft .NET Core SDK 3.0.103
dotnet-sdk-3.1/focal 3.1.301-1 amd64
Microsoft .NET Core SDK 3.1.301
然后我将结果存储在一个数组中:
user@NUC7CJYH:~$ d=($(apt search dotnet-sdk-3 2>/dev/null | grep dotnet | cut -c 1-14))&&echo ${d[@]}
dotnet-sdk-3.0 dotnet-sdk-3.1
现在我陷入了按版本对数组进行排序并获取最新版本的索引的问题。
我想知道这是否是正确的方法(对数组进行排序,获取字符串并安装此版本)或者是否有人知道自动安装最新版本的命令?
谨致问候,Stefan
答案1
为了保持软件包的更新,我认为sudo apt-get update
sudo apt-get upgrade
应该足够了。我使用 python 来查找命令返回的最高版本号
import re, sys
from distutils.version import StrictVersion
def get_release(out):
r = re.compile(f'.*([v]?[0-9]+\.[0-9]+\.[0-9]+)$')
maxrel = "0.0.0"
for rel in out:
if r.match(rel) is not None:
rel= r.split(rel)[1]
if StrictVersion(rel) > StrictVersion(maxrel): maxrel = rel
return maxrel
if __name__ == '__main__':
print(get_release(sys.stdin.read().split("\n")))
您提到的命令并没有返回相同的结果。我将文本粘贴到文件中
$ cat dotnet.txt | python3 maxver.py
3.1.301
从 git 获取最高可用版本:
$ git ls-remote --tags --refs https://github.com/jquery/jquery.git | python3 maxver.py
3.5.1
将其放在一起下载最新版本
$ wget -nv https://github.com/jquery/jquery/archive/$(git ls-remote --tags --refs https://github.com/jquery/jquery.git | python3 maxver.py).zip
2020-06-16 10:49:01 URL:https://codeload.github.com/jquery/jquery/zip/3.5.1 [1520729/1520729] -> "3.5.1.zip" [1]
答案2
我最终这样解决了它:
desc="install dotnet SDK"
# find latest dotnet release (in version tree 3.x)
dotnet_releases=($(apt search dotnet-sdk-3 2>/dev/null | grep dotnet | cut -c 1-14))
dotnet_sorted=($(printf '%s\n' "${dotnet_releases[@]}" | sort -r))
echo -e "Latest dotnet version in the 3.x branch is: ${dotnet_sorted[0]} "
dpkg -s ${dotnet_sorted[0]}
if [ $? -eq 1 ]; then
apt-get install -q -y "${dotnet_sorted[0]}" && success $desc || failed $desc
else
success $desc
fi
请忽略我的成功或失败的功能,它们只是回显字符串并进行一些日志记录。