xmlstarlet无法删除destructiveChanges.xml指定types节点问题求助
问题根因
- Shell 变量插值规则限制:你当前的xmlstarlet命令中,XPath路径用单引号包裹,单引号内的所有内容会被Shell视为字面量,其中的
${metadaType}不会被替换为实际的ApexClass值,导致XPath始终匹配不到目标节点。 - 次要错误:
- 删除文件的命令
rm - destructiveChanges.xml存在语法错误,多余的短横线会导致命令执行异常 - 文件删除判断逻辑错误:你统计的是删除后剩余的
<types>块数量,应该是剩余数量为0时才删除整个XML文件,而非等于1时删除
- 删除文件的命令
修复方案
你只需要修改两处核心代码即可:
- 调整xmlstarlet命令的引号规则,保证变量正常插值,修改为:
xmlstarlet ed --inplace -d "//_:types[_:name='$metadaType']" destructiveChanges.xml
- 修正文件删除逻辑和命令:
# 剩余types块数量为0时删除文件 if [ "$deleted" -eq 0 ]; then echo "=== Deleting destructiveChanges.xml file ===" rm -f destructiveChanges.xml fi
完整修改后的script段代码
script: - nomDeployedDC=${NONDEPLOYEDDC} - echo -e "Test ${nomDeployedDC} " - > if [ ! -z "$nomDeployedDC" ]; then echo "=== Additional cleaning ===" for cleanItem in ${nomDeployedDC}; do metadaType=${cleanItem%:*} echo -e "Loop ${metadaType} " cat destructiveChanges.xml echo -ne "Cleaning ${metadaType} " # 仅修改这一行的引号规则 xmlstarlet ed --inplace -d "//_:types[_:name='$metadaType']" destructiveChanges.xml cat destructiveChanges.xml echo -e "\rCleaning final ${metadaType} " done isDeleted="$(grep -c "<types>" destructiveChanges.xml)" deleted=${isDeleted%:*} echo -e "isDeleted ${deleted} " # 修改判断条件和rm命令 if [ "$deleted" -eq 0 ]; then echo "=== Deleting destructiveChanges.xml file ===" rm -f destructiveChanges.xml fi else echo -e "Additional cleaning should be added in the destructiveClean.list file " fi
内容的提问来源于stack exchange,提问作者Erick Barbosa
相关产品推荐
相关产品推荐

