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
使用方法
- 将脚本保存为
check_version.sh,添加执行权限:chmod +x check_version.sh - 执行时传入所有需要校验的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
相关产品推荐
相关产品推荐

