首页 > 解决方案 > 如何使用 bash 在文本文件中维护不同文件的最新版本

问题描述

我必须在一个文本文件中维护不同文件的版本控制。例如:- 如果有 2 个文件 abc-1.0.0.jar 和 def-1.0.0.jar

所以当我运行命令时,这个带有版本的文件名应该被复制到文本文件中(我们称之为 version.txt)

所以 cat version.txt 的输出应该显示两个文件 abc-1.0.0.jar def-1.0.0.jar

并且当部署文件的下一个版本(例如 2.0.0)时,该版本也应该在文本文件中更新

猫版本.txt

abc-2.0.0.jar def-2.0.0.jar

我试过了,但无法更新同一文本文件中的两个文件..

artifact= abc
version= 1.0.0
echo "$artifact-$version" > version.txt

但是上面的命令将只保留一个文件,如果我给出以下命令:- echo "$artifact-$version" >> version.txt 那么这将继续添加所有版本。但我只需要匹配文件的更新版本

请让我知道如何解决这个问题。

标签: linuxbashshellunixsh

解决方案


希望这对您有用。

#!/bin/bash
compare_versions () {
    if [[ $1 == $2 ]]
    then
        return 0
    fi
    local IFS=.
    local i ver1=($1) ver2=($2)
    # fill empty fields in ver1 with zeros
    for ((i=${#ver1[@]}; i<${#ver2[@]}; i++))
    do
        ver1[i]=0
    done
    for ((i=0; i<${#ver1[@]}; i++))
    do
        if [[ -z ${ver2[i]} ]]
        then
            # fill empty fields in ver2 with zeros
            ver2[i]=0
        fi
        if ((10#${ver1[i]} > 10#${ver2[i]}))
        then
            return 1
        fi
        if ((10#${ver1[i]} < 10#${ver2[i]}))
        then
            return 2
        fi
    done
    return 0
}

echo "Version list" > version.txt
filename=($(ls -1 *.jar | sed -e 's/\.jar$//' | cut -d"-" -f1 | uniq))
for f in ${filename[@]}; do
    ver=($(ls -1 $f* | sed -e 's/\.jar$//' | cut -d"-" -f2))
    v1=${ver[0]}
    for ((i=1; i<${#ver[@]}; i++)); do
        v2=${ver[$i]}
        compare_versions $v1 $v2 '<'
        if [ $? -eq "2" ]; then
            v1=$v2
        fi
    done
    echo  "updated version of $f is $v1" >> version.txt 
done

这是我测试过的文件

abc-0.0.1.jar  abc-1.0.0.jar  abc-1.0.1.jar  abc-2.0.0.jar  cde-1.0.0.jar  cde-1.0.1.jar

这是 version.txt 的输出

Version list
updated version of abc is 2.0.0
updated version of cde is 1.0.1

我确实从这个答案https://stackoverflow.com/a/4025065/13876104中得到了一些启发,并使用了 vercomp 函数。(谢谢!)


推荐阅读