VERSION="4.0beta12"
NEXT_VERSION=?????
编写自动发布脚本,我将当前版本保存在变量 $VERSION 中,并且我想将下一个版本计算为 $NEXT_VERSION。
规则:增加字符串末尾的整数。
4.0beta12 → 4.0beta13
4.2alpha9 → 4.2alpha10
我尝试过 sed/awk/eval 但无法使其工作。有想法吗?任何工具都可以。
答案1
除了 Bash 之外不需要任何东西:
for version in 12.4alpha9 12.4alpha12 12.4alpha-2; do
echo -n "$version => ";
[[ "$version" =~ (.*[^0-9])([0-9]+)$ ]] && version="${BASH_REMATCH[1]}$((${BASH_REMATCH[2]} + 1))";
echo "$version";
done
唯一与您真正相关的行是带有正则表达式检查的行[[
:它会记住导致最终数字的所有内容,重用它并附加下一个数字。
答案2
假设你总是有一些合理的格式良好的规则(版本中总是非数字,版本总是以数字结尾),尽管很笨拙,但这可能是一个开始:
#!/usr/bin/gawk -f
1 {
pfx = gensub(/^(.*[^0-9])([0-9]+)$/, "\\1", "")
patchlevel = gensub(/^(.*[^0-9])([0-9]+)$/, "\\2", "")
new_pl = (1*patchlevel)+1
printf "%s%s\n", pfx, new_pl
}
测试:
[0 1066] ~/temp % echo "12.4alpha9" | gawk -f incvers.awk
12.4alpha10
[0 1067] ~/temp % echo "12.4alpha12" | gawk -f incvers.awk
12.4alpha13
[0 1068] ~/temp % echo "12.4alpha-2" | gawk -f incvers.awk
12.4alpha-3
答案3
尝试拥有
MAJOR=4
MINOR=0
STATE="beta"
POINT=9
VERSION=$MAJOR.$MINOR$STATE$POINT
NEXT_VERSION=$MAJOR.$MINOR$STATE$((POINT +1 ))
echo "Next version is $NEXT_VERSION"
# other release stuff here
想要这是一个自重写脚本吗?我建议类似的东西
tempfile=$( tempfile -d . )
sed -re "s/POINT=[0-9]+/POINT=$(( ++POINT ))/" $0 > $tempfile
chmod +x $tempfile
mv $tempfile $0
答案4
这是一个可移植的 shell 片段,它将 1 末尾的数字加 1 $current_version
。
n=${current_version##*[!0-9]}; p=${current_version%%$n}
next_version=$p$((n+1))
仅仅因为它很简单(嗯,相当简单)并不意味着它是一个好主意。喜欢安德鲁,我建议将变量定义分解为组件。