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
使用火山灰在高山上工作。
我正在尝试实施一个增加版本的解决方案。这是我想出的:
#!/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
使用火山灰在高山上工作。