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

Bash带计数器循环无匹配项时计数返回1的问题排查

Shell脚本无匹配文件时计数器异常为1的修复方案

问题根因

计数异常是三处逻辑疏漏共同导致的:

  • 计数器初始化位置错误:count=0被写在了DT_FILES非空的判断分支内部,当当前文件夹没有匹配到目标DT文件时,计数器不会被重置为0,会直接沿用上一次循环留下的计数值,这是空场景下输出1的核心原因。
  • 目录切换逻辑有隐藏bug:循环内执行cd ${f}进入子目录后,没有切回上级原目录,处理完第一个子文件夹后工作目录就会偏移,后续所有文件检索的路径都会出错。
  • 非空判断逻辑鲁棒性不足:直接用算术运算判断${#DT_FILES}长度的写法,遇到命令替换输出多余换行、特殊文件名时容易出现误判。

修复后代码

修复点对应三个问题:将计数器初始化移到每个文件夹循环的起始位置、取消不必要的cd操作直接在find时指定目标路径、用字符串非空判断替代原长度判断,同时局部化IFS配置避免污染全局shell环境:

function create_tifs()
{
    local IFS=$'\n'
    local count=0
    local OG NONE

    # 遍历当前目录下所有一级子文件夹
    for f in $(find . -maxdepth 1 -mindepth 1 -type d)
    do
        # 每个文件夹处理前先重置计数器
        count=0
        echo -e "\n${OG}>>> Folder processed: ${f} ${NONE}"

        # 直接检索目标子文件夹内的DT文件,无需切换工作目录
        DT_FILES=$(find "${f}" -type f -name '*-DT-*' | grep -v '.jpg')
        
        if [[ -n "${DT_FILES}" ]]
        then
            for b in ${DT_FILES}
            do
                if [[ "${b}" != *".tif" ]]
                then
                    # 确认逻辑无误后再取消下一行的注释
                    # cp -n "${b}" "${b}.tif"
                    echo -e "TIF created ${b} as ${b}.tif"
                    echo
                    ((count++))
                else
                    echo -e "TIF already done ${b}"
                fi
            done
        fi

        echo -e "\nCount = ${count}"
    done
}

鲁棒性优化建议

如果需要兼容带空格、换行的特殊文件名,可以把DT_FILES改成数组存储,进一步避免字符串拆分导致的异常:

# 把DT_FILES存为数组
mapfile -t DT_FILES < <(find "${f}" -type f -name '*-DT-*' | grep -v '.jpg')
# 判断数组长度非空
if (( ${#DT_FILES[@]} ))
then
    # 遍历数组元素
    for b in "${DT_FILES[@]}"
    do
        # 原有业务逻辑保持不变即可
    done
fi

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 22:33:01