如何在bash shell环境中自动增加文件名版本?

时间:2018-12-10 12:02:12

标签: bash

对于上下文,我正在构建Jenkins作业以自动git标记我们的分支代码。想法是按照以下方式构造分支标记命名标准:

<latest_tag_in_branch>.<branch_name>.<revision>

我们假设分支名称为“ hotFix”。如果最新标记未在其中包含分支名称(例如2.0.55),则我们应该在其后附加修订版1。例如

2.0.55.hotFix.1

如果在此hotFix分支上创建了另一个标签而不合并任何其他代码(因此最新的公共标签不变),则该标签将变为:

2.0.55.hotFix.2

如果我们然后与master合并,后者创建了后续标签(例如,以最新版本2.0.58为例),则该分支的下一个版本将“重置”为:

2.0.58.hotFix.1

命令:

git describe --abbrev=0 --tags

将为我获取最新标签。例如,它将是2.0.552.0.55.hotFix.1。如何在bash shell环境中使用此信息来完成其余的标签名?例如。追加<branch_name>.1或将<revision>加1。

到目前为止,我的代码:

> git describe --abbrev=0 --tags

(返回例如2.0.55或2.0.55.hotFix.3)

由于对bash经验不足,因此我不确定下一步的最佳方法。

2 个答案:

答案 0 :(得分:1)

您可以将git命令的输出pipe放入另一个可以操纵文本的进程中(我在这里更喜欢awk)。

git describe --abbrev=0 --tags | awk -F. -v OFS=. '{
 if (NF == 3) $0 = $0".hotFix.1"
 else if (NF >= 5) $5 += 1
} 1'

这是为了将git命令的输出重定向到awk(作为输入)。

  1. 我们分别通过执行.-F.将输入和输出定界符设置为-v OFS=.

  2. awk将运行我们用大括号提供的脚本。

  3. 我们的脚本将检查输入是否具有三个参数(对于2.0.55)。 NF是一个预定义的变量,在输入中存储 n 字段$0 = $0".hotFix.1".hotFix.1连接到整个输入(即$0)上。

  4. 如果输入没有三个参数,我们检查它是否至少有5个参数(NF >= 5)。然后将第五个字段加1($5 += 1)。

  5. 最后,一旦脚本运行完成,我们通过在右括号后面附加1来打印语句。请注意,如果输入只有一个或两个字段,它将打印输入而未修改。

请注意,您也可以将awk写在一行上。我选择将其写成几行,因为它更具可读性。


如果您希望使用正则表达式检查第五个字段是否为整数(在应用+= 1之前,可以将else if修改为

else if (NF >= 5 && $5 ~ /^[0-9]*$/) $5 += 1

这将检查字段(NF)的数目是否大于5 ,并且检查第五个字段($5)是否与(~)匹配从开头(/.../)到结尾([0-9]*)带有数字(^)的正则表达式模式($)。

答案 1 :(得分:1)

branch_name="hotFix"                                 
example1="2.0.55.hotFix.1"                           
example2="2.0.55"                                    

regex_short="([0-9]+[.][0-9]+[.][0-9]+)"             
regex_long="($regex_short[.]$branch_name)[.]([0-9]*)"
for example in $example1 $example2; do               
  if [[ $example =~ $regex_long ]]; then             
    prefix=${BASH_REMATCH[2]}                        
    version=${BASH_REMATCH[3]}                       
    let ++version                                    
  elif [[ $example =~ $regex_short ]]; then          
    prefix=${BASH_REMATCH[1]}                        
    version=1                                        
  fi                                                 
  nvers="$prefix.$branch_name.$version"              
  echo "old_version: $example -> new_version: $nvers"
done