查找远程和本地版本号,比较它们,如果更大则下载

Find remote and local version numbers, compare them, and download if greater

我有一个可行的解决方案,但 presentable/clean 不适用于 public 用法。 文件“version.txt”既是远程文件又是本地文件。不同的是数量:

远程:

17 March 2022
FVWM myExtensions ver. 3.1.4

本地:

15 March 2022
FVWM myExtensions ver. 3.1.1

在我的“糟糕”解决方案中,我手动将这些行更改为一行,以便 awk 找到最后一列并使用 sed 删除数字之间的点。两个结果都作为变量。

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

finding the number in text line

这使用正则表达式很容易做到,例如使用 GNU AWK,令 file.txt 内容为

17 March 2022
FVWM myExtensions ver. 3.1.4

然后

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

输出

3.1.4

解释:我通知 GNU AWK 该字段包含 1 个或多个数字或点、文字点(因此 [.] 而不是 .)、1 个或多个数字或点。然后,如果给定行中存在一个或多个此类字段,请打印第一个字段(此解决方案假设每行中最多有 1 个此类字段)

(在 gawk 4.2.1 中测试)

comparing multiple dot numbers

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

对 Version-sort 使用 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

鉴于以上内容,如果两者不同,将打印包含最高版本号的文件的名称,否则不打印任何内容:

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

那么你就可以测试这是否是远程文件名,如果是就下载。