shell 脚本中的 semver 增量

semver increment in shell script

我正在尝试实施一个增加版本的解决方案。这是我想出的:

#!/bin/sh -x

VAR=1.0.1 # retrieved from Gitlab API

case  in
patch)
    TAG=${VAR%.*}.$((${VAR##*.} + 1))
    ;;

major)
    TAG=$((${VAR%%.*} + 1)).0.0
    ;;

*)
    tmp=${VAR%.*}
    minor=${tmp#*.}
    TAG=${VAR%%.*}.$((minor + 1)).0
    ;;
esac

echo $TAG

major & patch 按预期工作;但是,我面临递增 minor.

的问题

碰撞1.0.1时,未成年人应1.1.0;但是,我的代码生成 1.2.0。我做错了什么?

更多信息,脚本在 GitlabCI 管道内执行。

编辑:使用 @jhnc

的建议答案更新了代码

你对递增 minor 的计算是:

TAG=${VAR%%.*}.$((${VAR##*.} + 1)).0

但是,${VAR##*.} 给出了补丁值,而不是次要值,因此你的结果不正确。

要提取minor,可以使用一个临时变量:

tmp=${VAR%.*}
minor=${tmp#*.}
TAG=${VAR%%.*}.$((minor + 1)).0

或者,设置 IFS 并在点上拆分字符串可能更具可读性:

TAG=$(
   echo "$VAR" | while IFS=. read major minor patch; do
       # add sanity-checks here
       case "" in
          patch)
             echo "$major.$minor.$((patch+1))"
             ;;
          major)
             echo "$((major+1).0.0"
             ;;
          minor|*)
             echo "$major.$((minor+1)).0" 
             ;;
       esac
   done
)

您可能应该添加完整性检查以确保 VAR 实际上是“digits dot digits dot digits”的形式。

我只想:

#!/bin/sh

var=1.0.1
IFS=. read -r version minor patch <<EOF
$var
EOF

case "" in
patch) tag="$version.$minor.$((patch+1))"; ;;
major) tag="$((version+1)).0.0"; ;;
*)     tag="$version.$((minor+1)).0"; ;;
esac

echo $tag

使用火山灰在高山上工作。