需求:编写Shell脚本读取XML属性文件批量更新多份Profile配置文件
Shell脚本实现XML配置批量更新方案
前置依赖
- 需安装XML专用处理工具
xmlstarlet,避免用正则硬解析XML导致的格式损坏问题:- Debian/Ubuntu系执行:
apt install xmlstarlet - CentOS/RHEL系执行:
yum install xmlstarlet
- Debian/Ubuntu系执行:
实现逻辑
- 遍历指定规则命名的profile配置文件(支持xml、txt后缀,只要内容为示例中的XML结构即可)
- 从profile文件名提取标识,映射到properties属性文件中对应的
AppnodeName节点 - 读取对应节点下所有
Name-Value配置对 - 定位到profile文件中相同
AppnodeName、相同Name的配置节点,更新对应的Value值 - 自动备份原文件,支持异常回滚
完整脚本
#!/bin/bash # 基础配置,可根据实际场景修改 PROPERTIES_PATH="./properties.xml" # 源属性配置文件路径 PROFILE_MATCH_RULE="./profile[0-9]*.xml" # 待更新profile文件的匹配规则 BAK_SUFFIX=".bak" # 原文件备份后缀 # 依赖检查 if ! command -v xmlstarlet &>/dev/null; then echo "错误:请先安装xmlstarlet工具后再执行脚本" exit 1 fi # 源文件检查 if [ ! -f "$PROPERTIES_PATH" ]; then echo "错误:源属性文件$PROPERTIES_PATH不存在" exit 1 fi # 遍历所有待处理profile文件 for profile in $PROFILE_MATCH_RULE; do [ -f "$profile" ] || { echo "警告:未找到匹配的profile文件,跳过"; continue; } echo "处理文件:$profile" # 从文件名提取节点编号,映射对应AppnodeName,可根据实际命名规则修改此处逻辑 node_id=$(echo "$profile" | grep -oE '[0-9]+' | head -1) [ -z "$node_id" ] && { echo " 警告:无法从文件名提取节点标识,跳过"; continue; } target_node="Node${node_id}" echo " 匹配节点:$target_node" # 备份原文件 cp "$profile" "${profile}${BAK_SUFFIX}" echo " 已备份原文件至 ${profile}${BAK_SUFFIX}" # 批量更新配置项 xmlstarlet sel -t -m "//Properties/Node[AppnodeName='${target_node}']/Property" \ -v "Name" -o "|" -v "Value" -n "$PROPERTIES_PATH" | while IFS='|' read -r conf_name conf_val; do [ -z "$conf_name" ] || [ -z "$conf_val" ] && continue echo " 更新配置:$conf_name -> $conf_val" xmlstarlet ed -L \ -u "//Properties/Node[AppnodeName='${target_node}']/Property[Name='${conf_name}']/Value" \ -v "$conf_val" "$profile" done echo " $profile 处理完成" done echo "所有配置更新执行完毕"
使用调整说明
- 如果profile文件为txt后缀,只需将
PROFILE_MATCH_RULE中的.xml改为.txt即可,处理逻辑完全一致 - 如果文件名和
AppnodeName的映射规则不是「文件名提取数字+Node前缀」,直接修改target_node的赋值逻辑即可,例如文件直接命名为Node1.xml时,可通过${profile%.xml}直接取文件名作为节点名 - 如果XML实际结构和示例有差异,对应调整脚本中XPath路径(即
//Properties/Node/...这段)即可 - 脚本默认原地修改文件,修改前自动生成
.bak备份,更新异常时将备份文件改回原文件名即可恢复
注意事项
- 禁止用sed、awk等纯文本工具直接修改XML文件,遇到标签换行、注释插入、属性格式调整时极易破坏XML结构,
xmlstarlet基于DOM树解析修改,不会破坏原有文件格式和注释 - 正式执行前建议先拿测试文件验证匹配逻辑,确认更新结果符合预期后再操作正式配置
内容的提问来源于stack exchange,提问作者techguy
相关产品推荐
相关产品推荐

