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

xmlstarlet无法删除destructiveChanges.xml指定types节点问题求助

问题根因

  1. Shell 变量插值规则限制:你当前的xmlstarlet命令中,XPath路径用单引号包裹,单引号内的所有内容会被Shell视为字面量,其中的${metadaType}不会被替换为实际的ApexClass值,导致XPath始终匹配不到目标节点。
  2. 次要错误:
    • 删除文件的命令rm - destructiveChanges.xml存在语法错误,多余的短横线会导致命令执行异常
    • 文件删除判断逻辑错误:你统计的是删除后剩余的<types>块数量,应该是剩余数量为0时才删除整个XML文件,而非等于1时删除

修复方案

你只需要修改两处核心代码即可:

  1. 调整xmlstarlet命令的引号规则,保证变量正常插值,修改为:
xmlstarlet ed --inplace -d "//_:types[_:name='$metadaType']" destructiveChanges.xml
  1. 修正文件删除逻辑和命令:
# 剩余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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.12 00:45:03