Bash遍历指定路径下一级子目录执行脚本仅运行一次如何修复
脚本问题修复方案
问题原因
你的脚本循环提前终止是两个错误共同导致的:
- 全局开启了
set -e参数,只要任意命令返回非0退出码就会直接终止整个脚本,若第一个执行的recon1.sh返回非0退出码,整个批量脚本会直接停止 - 冗余的
cd ..逻辑错误:你执行recon1.sh时用了子shell(括号包裹的命令块),子shell的目录切换不会影响父脚本的工作目录,额外执行的cd ..会导致第一次循环结束后父脚本退出通路根目录,后续循环找不到目标蛋白子目录
修复后完整代码
#!/bin/bash # -*- coding: utf-8 -*- set -e current_path=$(pwd) pathway_name=$1 path_to_folder="${HOME}/ProjName/pathways/${pathway_name}" path_to_software_folder="${HOME}/ProjName/software" # 提前校验通路目录合法性 if [ ! -d "${path_to_folder}" ]; then echo "错误:指定的通路目录 ${path_to_folder} 不存在,请检查输入参数" exit 1 fi echo "----running batch_reconcile1.sh on pathway: $*" for fol in "${path_to_folder}"/*/; do [ -d "${fol}" ] || continue ## 非目录直接跳过 dirname="$(basename "${fol}")" # 子shell执行任务,单任务失败仅打印警告不终止全局循环 (cd "${fol}" && bash "${path_to_software_folder}/recon1.sh" "${dirname}" ) || echo "警告:处理蛋白目录 ${dirname} 时出现异常,已跳过继续处理后续任务" done # 执行完成回到脚本启动时的工作目录 cd "${current_path}"
改动说明
- 所有变量引用增加双引号,避免路径包含空格、特殊字符时执行报错
- 移除了错误的
cd ..语句,避免父脚本工作目录被意外切换 - 为
recon1.sh的执行逻辑增加了异常捕获,单个蛋白目录处理失败不会终止整个批量任务,兼容全局set -e的错误检查规则 - 新增通路目录存在性校验,提前拦截参数输入错误的场景
内容的提问来源于stack exchange,提问作者007
相关产品推荐
相关产品推荐

