bash - 如何在 bash shell 环境中自动增加文件名版本?
问题描述
对于上下文,我正在构建一个 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.55
或2.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 方面相对缺乏经验,我不确定下一步该做什么的最佳方法。
解决方案
您可以将命令的输出通过管道git
传输到另一个可以操作文本的进程(我更喜欢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
(作为输入)。
.
我们通过分别做-F.
和来设置输入和输出分隔符-v OFS=.
。awk
将运行我们在大括号中提供的脚本。我们的脚本将检查输入是否有三个参数(在 的情况下
2.0.55
)。NF
是一个预定义变量,用于存储输入中的字段数。将连接到整个输入(即)。$0 = $0".hotFix.1"
.hotFix.1
$0
如果输入没有三个参数,我们检查它是否至少有 5 个参数 (
NF >= 5
)。然后将第五个字段增加 1 ($5 += 1
)。最后,一旦脚本完成运行,我们通过
1
在右大括号后附加 a 来打印语句。请注意,如果输入只有一个或两个字段,它将打印未修改的输入。
请注意,您也可以将您awk
的写在一行上。我选择将它写成几行,因为它更具可读性。
如果您希望使用正则表达式来检查第五个字段是否为整数(在应用 之前+= 1
,您可以else if
将
else if (NF >= 5 && $5 ~ /^[0-9]*$/) $5 += 1
这将检查字段数 ( NF
) 是否大于 5 ,并检查第五个字段 ( $5
) 是否匹配 ( ~
) 正则表达式模式 ( /.../
) 与[0-9]*
从开头 ( ^
) 到结尾 ( ) 的数字 ( $
)。
推荐阅读
- javascript - Javascript自动计算
- intellij-idea - IntelliJ-添加testNG maven依赖带来junit
- angular - 在 mat-radio-group 中选择了多个 mat-radio-button
- c++ - Sizer 中的 C++ wxWidgets 巨大差距(初学者)
- javascript - 如何获取 Slack 操作消息发送的 JSON 有效负载?
- ubuntu - .NET Core 3.1 MSBuild 在 Ubuntu 上缺少 libc.musl-x86_64.so.1
- excel - Application.OnKey 用于多个打开的工作簿中的一个工作簿
- python - 如何在特定列中填写值?
- c# - 水晶报表在第二次运行时不显示数据
- deployment - 忽略注释的 Visual Studio 数据库项目