bash 变量字符串中的增量

bash 变量字符串中的增量
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))

仅仅因为它很简单(嗯,相当简单)并不意味着它是一个好主意。喜欢安德鲁,我建议将变量定义分解为组件。

相关内容