linux - 如何使用 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
那么这将继续添加所有版本。但我只需要匹配文件的更新版本
请让我知道如何解决这个问题。
解决方案
希望这对您有用。
#!/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 函数。(谢谢!)
推荐阅读
- php - 如何在 symfony 4 和 Swiftmailer 中测试发送电子邮件
- python - 如何根据某些条件投射(长到宽)数据帧
- charts - Charts JS xAxes 不被数据共享
- php - strip_tags php 删除太多
- php - PHP如何foreach atts列出项目
- android - 必须安装 ANDROID AVD“模拟器”包
- c++ - 在给定成员值引用的情况下检索 std::tuple 对象
- c - 如何在文档中显示常量变量或宏
- php - Wordpress 的 Timber/TWIG - 关于一些基础知识的问题
- asp.net - 我可以在我的 godaddy 共享主机上托管 asp.net core 2.0 网站吗?Win和Linux都可以吗?