Shell脚本自动递增目录版本功能异常,求调试修复
修正Shell脚本实现版本号递增与目录生成功能
原脚本无法实现版本持续递增的核心问题在于历史目录匹配规则错误:原脚本仅尝试匹配纯版本号命名的目录(如1.0.0.RELEASE/),但实际生成的目录格式为<git-branch>_<build-purpose>_<build-number>_<X.X.X.RELEASE>,导致每次都找不到已存在的历史目录,只能从0.0.0开始递增。此外,原逻辑未区分不同git_branch和build_purpose的版本序列,正确逻辑应为:同分支、同构建目的的目录共享一套版本号序列,不同分支或构建目的的版本号独立递增。
以下是修正后的完整脚本:
#!/bin/bash # 基于版本类型递增版本号 increment_version() { local version=$1 local version_type=$2 # 拆分版本号为major、minor、patch local major=$(echo "$version" | cut -d '.' -f 1) local minor=$(echo "$version" | cut -d '.' -f 2) local patch=$(echo "$version" | cut -d '.' -f 3) # 根据类型递增对应字段 case "$version_type" in major) ((major++)) minor=0 patch=0 ;; minor) ((minor++)) patch=0 ;; patch) ((patch++)) ;; *) echo "错误:不支持的版本类型 $version_type,仅支持major/minor/patch" exit 1 ;; esac echo "$major.$minor.$patch.RELEASE" } # 检查输入参数 if [ $# -lt 4 ]; then echo "用法: $0 <version_type> <build_number> <git_branch> <build_purpose>" echo "示例: $0 major 1 dev kafka" exit 1 fi version_type=$1 build_number=$2 git_branch=$3 build_purpose=$4 # 匹配同分支、同构建目的的历史版本目录,提取版本号部分 # 目录格式:<git_branch>_<build_purpose>_<build_number>_<X.X.X.RELEASE> versions=() while IFS= read -r dir; do # 从目录名中提取版本号部分(最后一个下划线后的内容) ver=$(echo "$dir" | awk -F '_' '{print $NF}' | sed 's/\.RELEASE//') versions+=("$ver") done < <(ls -d */ 2>/dev/null | grep -E "^${git_branch}_${build_purpose}_.*_[0-9]+\.[0-9]+\.[0-9]+\.RELEASE/$") # 找到最新版本号 latest_version="" if [ ${#versions[@]} -gt 0 ]; then # 按版本号自然排序,取最后一个即最新版本 latest_version=$(printf "%s\n" "${versions[@]}" | sort -V | tail -n1) fi # 计算新版本号 if [ -z "$latest_version" ]; then # 无历史目录,从0.0.0开始递增 new_version=$(increment_version "0.0.0" "$version_type") else # 基于最新版本递增 new_version=$(increment_version "$latest_version" "$version_type") fi # 拼接完整目录名 new_dir="${git_branch}_${build_purpose}_${build_number}_${new_version}" # 创建目录 if [ -d "$new_dir" ]; then echo "目录 $new_dir 已存在" else mkdir -p "$new_dir" echo "已创建目录: $new_dir" fi
关键修改说明
- 精准匹配历史目录:使用
grep -E "^${git_branch}_${build_purpose}_.*_[0-9]+\.[0-9]+\.[0-9]+\.RELEASE/$"仅匹配同分支、同构建目的的目录,确保版本序列独立。 - 正确提取版本号:通过
awk分割目录名,提取最后一个下划线后的版本号部分,再去除.RELEASE后缀。 - 自然版本排序:使用
sort -V实现版本号的自然排序,确保1.10.0能被正确识别为比1.2.0更新的版本。 - 增强健壮性:增加非法版本类型的判断,使用
mkdir -p避免父目录不存在导致的创建失败。
测试示例
- 首次执行(major版本递增):
sh versionedDirCreator.sh major 1 dev kafka
输出:已创建目录: dev_kafka_1_1.0.0.RELEASE
- 第二次执行(minor版本递增):
sh versionedDirCreator.sh minor 2 dev kafka
输出:已创建目录: dev_kafka_2_1.1.0.RELEASE
- 第三次执行(patch版本递增):
sh versionedDirCreator.sh patch 3 dev kafka
输出:已创建目录: dev_kafka_3_1.1.1.RELEASE
- 不同分支的版本独立递增:
sh versionedDirCreator.sh major 1 prod kafka
输出:已创建目录: prod_kafka_1_1.0.0.RELEASE
内容的提问来源于stack exchange,提问作者Harshit Gupta
相关产品推荐
相关产品推荐

