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

Bash嵌套for循环内层不生效 合并git克隆与目录统计脚本排查

问题根因

合并脚本内层统计逻辑完全不执行的核心原因如下:

  • 执行git clone拉取远程仓库时,仓库内容会被存放到以远程仓库名命名的独立子目录中,脚本在clone完成后没有切换到该生成的仓库目录内,工作目录始终是启动脚本的父目录,根本找不到tier1、tier2、tier3文件夹,[[ -d $topdir ]]判断永远不成立,后续统计逻辑完全不会触发。你单独运行CODE2时本身就处于仓库根目录下,所以能正常匹配目录,这是两段脚本表现不一致的核心原因。
  • 变量命名存在不规范问题:外层循环把存储URL列表的变量和循环临时变量都命名为URL,循环执行时会覆盖原列表变量值,当前场景虽未触发报错,但存在逻辑隐患。
  • 选项设置存在副作用:shopt -s nullglob是全局shell选项,设置后如果不主动还原,会影响脚本后续其他通配符匹配逻辑。
修复后的完整可运行代码
#!/bin/bash

# 仓库URL列表,变量名与循环临时变量区分,避免覆盖风险
REPO_URLS="https://bess-bitbucket.bearingpoint.com/scm/bnktst/allstars-autopilot-testcases.git https://bess-bitbucket.bearingpoint.com/scm/bnktst/anacredit-autopilot-testcases.git"

# 记录脚本启动时的原始工作目录,方便每次操作后切回
ORIGIN_DIR=$(pwd)
# 提前开启nullglob,避免无匹配项时通配符本身被当成统计结果
shopt -s nullglob

for repo_url in $REPO_URLS
do
    git clone --depth=1 $repo_url
    # 提取克隆生成的本地目录名:取URL最后一段,去掉.git后缀
    repo_dir=$(basename "$repo_url" .git)
    # 进入仓库目录,进入失败则跳过当前仓库统计,避免脚本异常中断
    cd "$repo_dir" || { echo "进入目录$repo_dir失败,跳过该仓库统计"; cd "$ORIGIN_DIR"; continue; }
    
    echo "===== 开始统计仓库$repo_dir子目录数 ====="
    for topdir in tier[1-3]
    do
        if [[ -d $topdir ]]
        then
            subdirs=("$topdir"/*/)  
            echo "Number of subdirectories below $topdir is ${#subdirs[@]}"
        else
            echo "目录$topdir不存在,跳过"
        fi
    done
    echo "===== 仓库$repo_dir统计完成 ====="
    # 切回原始目录,保证下一次仓库clone路径正确
    cd "$ORIGIN_DIR"
done

# 还原nullglob选项,避免修改shell默认行为影响后续逻辑
shopt -u nullglob
关键修复点说明
  • 每次clone完成后,通过basename命令从URL中提取本地生成的仓库目录名,主动进入该目录后再执行tier文件夹统计,解决找不到目标目录的核心问题。
  • 新增原始工作目录记录,每次统计完单个仓库后切回原路径,避免后续仓库clone、目录切换出现路径错误。
  • 增加目录进入失败的容错逻辑,遇到单个仓库clone异常时不会中断整个脚本执行。
  • 脚本执行完主动关闭nullglob选项,消除全局选项的副作用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 02:48:28