我正在致力于自动创建发布包,但对于编写 bash 脚本还是个新手。
我有一个文件,其中包含以下行,显示该版本的当前版本:
#define VER_MAJOR 1
#define VER_MINOR 8
#define VER_BUILD 5
我需要编写一个脚本,可以从文件中检索版本号的三个部分。增加内部版本号,然后将新版本号重写回文件中检索它们的同一行。
我已经在下面描述了脚本格式。
#Release Creation Script
#Retrieve Current Version
VERSION_RAW_STRING='grep -n "#define VER_" version.h'
#Parse Line Numbers
#Parse Major/Minor/Build Numbers
VER_MAJOR=1
VER_MINOR=1
VER_BUILD=1
#Increment Build Number
VER_BUILD+=1
#Write Updated Version Back to main.cpp at Same Line Number
#Create Git Tag
$(git tag v${VER_MAJOR}.${VER_MINOR}.${VER_BUILD})
#Get Current Git Information
BUILD_TIME=`date +%FT%T%z`
GIT_REVISION=`git rev-parse --short HEAD`
GIT_BRANCH=`git rev-parse --symbolic-full-name --abbrev-ref HEAD`
GIT_DIRTY=`git diff-index --quiet HEAD -- || echo "✗-"`
GIT_TAG_DIRTY=`git describe --exact-match --tags > /dev/null 2> /dev/null || echo "+"`
GIT_TAG=`git describe --abbrev=0 --tags`
#Concatenate Git info and Echo
GITINFO="
buildTime = \"${BUILD_TIME}\"
gitRevision = \"${GIT_DIRTY}${GIT_REVISION}${GIT_TAG_DIRTY}\"
gitBranch = \"${GIT_BRANCH}\"
gitTag = \"${GIT_TAG}\""
echo "$GITINFO"
#Create Backup Package of Release
$(git archive -o ${GIT_TAG}.zip master)
何时增加其他版本号的逻辑超出了这个问题的范围。我真的只是想很好地理解如何从文件中读取操作输出并将其写回设定位置。
我目前正在使用 grep 来检索这些行以及它们在命令行中所在的行号:
$ grep -n "#define VER_" main.cpp
98:#define VER_MAJOR 1
99:#define VER_MINOR 8
100:#define VER_BUILD 5
现在我陷入了如何将其制作为一个脚本的困境,然后我可以解析返回消息以存储行号和版本号,以便我可以增加它们重建字符串并在文件中替换它们
正如 Charles Duffy 所指出的,混合自动编辑和人工维护的代码可能不是一个好主意。
另外请注意,
grep
只是一个解析程序,它不能自行编辑文件。
问题的解决方案可能是使用这个命令(如果您安装了 GNU
sed
):
sed -Ei 's/^(#define VER_BUILD[[:space:]]+)([0-9]+)$/echo "\1$((\2+1))"/e' main.cpp
说明:
-E
用于扩展正则表达式-i
告诉 sed
就地编辑文件/e
允许我们将匹配的部分传递给外部命令^(#define VER_BUILD[[:space:]]+)([0-9]+)$
,^
和$
分别用于标记行的开始/结束。\1
和 \2
瞧,您的 VER_BUILD 数量增加了!
为了安全问题,你可能不喜欢在原地进行(
sed -E '...' main.cpp >main_edited.cpp
)