You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Shell脚本校验不同层级XML文件version标签版本号匹配问题咨询

实现方案

直接用xmlstarlet处理XML比sed更稳定,不受标签层级、换行、空格等格式影响,完全匹配你的需求,以下是可直接使用的脚本:

第一步:安装依赖

xmlstarlet是主流系统都支持的XML处理工具:

  • Debian/Ubuntu:sudo apt install xmlstarlet
  • CentOS/RHEL:sudo yum install xmlstarlet
  • macOS:brew install xmlstarlet

第二步:完整脚本

#!/bin/bash

# 无参数时报错退出
if [ $# -eq 0 ]; then
    echo "Usage: $0 <xml-file1> <xml-file2> ..."
    exit 1
fi

versions=()
for xml_file in "$@"; do
    # 校验文件存在性
    if [ ! -f "$xml_file" ]; then
        echo "Error: 目标文件 $xml_file 不存在"
        exit 1
    fi

    # 提取任意层级的第一个version标签内容
    raw_version=$(xmlstarlet sel -t -v "//version" "$xml_file" | grep -v '^$' | head -n1)
    # 去除-后的所有后缀,保留数字、点组成的核心版本号
    core_version=$(echo "$raw_version" | sed 's/-.*$//')

    versions+=("$core_version")
done

# 统计去重后的版本数量
unique_count=$(printf "%s\n" "${versions[@]}" | sort -u | wc -l)

if [ "$unique_count" -eq 1 ]; then
    match_version=$(printf "%s\n" "${versions[@]}" | sort -u | head -n1)
    echo "OUTPUT - Versions Match - $match_version"
    exit 0
else
    echo "OUTPUT - Version Mismatch - Check Version"
    # 解开下方注释可输出每个文件对应的版本,方便排查
    # for idx in "${!versions[@]}"; do
    #     echo "${@:$idx+1:1}: ${versions[$idx]}"
    # done
    exit 1
fi

使用方法

  1. 将脚本保存为check_version.sh,添加执行权限:chmod +x check_version.sh
  2. 执行时传入所有需要校验的XML文件即可:
./check_version.sh File1.xml File2.xml File3.xml

自定义调整说明

  • 如果单个XML文件内存在多个version标签,可修改head -n1调整取值逻辑,比如取第二个就改成head -n2 | tail -n1
  • 如果仅需要忽略固定的SNAPSHOT/RELEASE后缀,保留版本号里其他带-的内容,可将sed规则替换为:sed 's/-\(SNAPSHOT\|RELEASE\)$//'

内容的提问来源于stack exchange,提问作者jb1980

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 04:45:04