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
相关产品推荐
相关产品推荐

