查找远程和本地版本号,进行比较,如果版本号更大,请下载



我有一个可行的解决方案,但它不适合公开使用。文件";txt版本";既是远程的,也是本地的。区别在于数字:

远程:

17 March 2022
FVWM myExtensions ver. 3.1.4

本地:

15 March 2022
FVWM myExtensions ver. 3.1.1

在我的";"差";解决方案我手动将行改为一行,让awk找到最后一列,并删除数字之间的点。这两个结果都作为变量。

awk '{print $NF}' download/version.txt > tmpGit.txt
VARgit=`sed 's|[.]||g' tmpGit.txt`
awk '{print $NF}' ~/.fvwm/version.txt > tmpLocal.txt
VARlocal=`sed 's|[.]||g' tmpLocal.txt`
if [ "$VARgit" -gt "$VARlocal" ]; then
echo "New update available.";
else
echo "No update.";
fi

我还没有找到在文本行中查找数字并比较多个点号的解决方案。提前谢谢。

您可以使用grep执行此操作,例如:

IFS=. read rmajor rminor rpatch < <(grep -oE '[0-9]+.[0-9]+.[0-9]+' remote.txt)
IFS=. read lmajor lminor lpatch < <(grep -oE '[0-9]+.[0-9]+.[0-9]+' local.txt)
[ $rmajor -gt $lmajor ] && echo "New major version"
[ $rminor -gt $lminor ] && echo "New minor version"
[ $rpatch -gt $lpatch ] && echo "New patchlevel"

编辑

因此,为了测试remote.txt是否包含更新的版本,假设所有版本项都是数字的,类似这样的操作有效:

if [ $rmajor -gt $lmajor ]; then
echo "New major version"
elif [ $rmajor -eq $lmajor -a $rminor -gt $lminor ]; then
echo "New minor version"
elif [ $rmajor -eq $lmajor -a $rminor -eq $lminor -a $rpatch -gt $lpatch ]; then
echo "New patchlevel"
else
echo "Remote has same version or older."
fi

使用GNU排序进行版本排序:

$ awk -v OFS='t' '/FVWM/{print $NF, FILENAME}' local remote | sort -k1,1Vr
3.1.4   remote
3.1.1   local

这将按降序告诉您版本号和包含每个版本号的文件名。

以上是在这些输入文件上运行的:

$ head local remote
==> local <==
15 March 2022
FVWM myExtensions ver. 3.1.1
==> remote <==
17 March 2022
FVWM myExtensions ver. 3.1.4

鉴于以上情况,如果2个不同,这将打印包含最高版本号的文件名,否则不打印:

$ awk -v OFS='t' '/FVWM/{print $NF, FILENAME}' local remote |
sort -k1,1Vr |
awk '
{ vers[NR]=$1; files[NR]=$0; sub(/[^t]+t/,"",files[NR]) }
END{ if ( vers[1] != vers[2] ) print files[1] }
'
remote

因此,您可以测试这是否是远程文件名,如果是,请下载。

在文本行中查找数字

使用正则表达式很容易做到这一点,例如使用GNUAWK,让file.txt内容为

17 March 2022
FVWM myExtensions ver. 3.1.4

然后

awk 'BEGIN{FPAT="[0-9.]+[.][0-9.]+"}NF{print $1}' file.txt

输出

3.1.4

解释:我通知GNUAWK,字段由1个或多个数字或点、文字点(因此[.]而不是.(、1个或更多数字或点组成。然后,如果给定行中存在一个或多个这样的字段,请打印第一个字段(此解决方案假设每行中最多有一个这样的域(

(在gawk 4.2.1中测试(

比较多个点号

我不知道这方面的现成解决方案,但我想注意的是,这项任务看起来可能很容易,但除非你能强制执行某些限制,否则就不是这样。在您的示例中,您有3.1.13.1.4,即所有元素都是<10,因此如果您对字母排序的需求进行比较,您将得到预期的结果。考虑一下如果你有3.93.11会发生什么——后者会更早被考虑,因为第一个差异在第三个位置,而1在字母表中比9更早。如果您可以强制要求所有部分都由一个数字组成,则不会出现此问题。

相关内容

最新更新