You need to enable JavaScript to run this app. 如何在多个Bash脚本文件中查找同名且内容完全一致的函数
优惠活动
大模型
产品
解决方案
定价
更多

如何在多个Bash脚本文件中查找同名且内容完全一致的函数

解决方案

你可以直接用awk脚本批量提取所有sh文件的函数并自动比对内容,无需手动核对,可直接输出符合要求的重复函数及对应文件列表,命令如下:

awk '
# 匹配function开头的函数定义行
/^function [a-zA-Z0-9_]+[[:space:]]*$/ {
    func_name = $2
    in_func = 1
    brace_count = 0
    func_content = ""
    next
}
# 处理函数体内容
in_func == 1 {
    func_content = func_content $0 "\n"
    # 统计大括号匹配数,闭合时结束函数提取
    if (/{/) brace_count++
    if (/}/) brace_count--
    if (brace_count == 0) {
        # 计算函数内容MD5哈希
        cmd = "echo \047" func_content "\047 | md5sum | awk \047{print $1}\047"
        cmd | getline md5
        close(cmd)
        key = func_name ":" md5
        # 存储对应文件,自动去重同文件内重复定义
        if (!(key in file_list)) {
            file_list[key] = FILENAME
        } else if (file_list[key] !~ FILENAME) {
            file_list[key] = file_list[key] " " FILENAME
        }
        in_func = 0
    }
    next
}
END {
    # 仅输出出现在2个及以上文件中的同名同内容函数
    for (key in file_list) {
        split(key, arr, ":")
        split(file_list[key], files, " ")
        if (length(files) >= 2) {
            print "函数名:" arr[1]
            print "内容哈希:" arr[2]
            print "所在文件:" file_list[key]
            print "-------------------------"
        }
    }
}
' *.sh

逻辑说明

  • 自动遍历当前目录所有.sh后缀文件,识别函数定义并提取完整函数体
  • 对每个函数的原始内容计算MD5哈希作为内容唯一标识,只要内容完全一致哈希就相同
  • 以「函数名+内容哈希」为聚合维度,自动记录所有出现该函数的文件
  • 最终仅输出出现在2个及以上文件中的结果,完全匹配筛选需求

适配调整项

  • 若脚本中存在不含function关键字的函数定义(格式为foo1() {),只需将开头的匹配规则修改为/^[a-zA-Z0-9_]+\(\)[[:space:]]*{?$/,同时将func_name = $2改为func_name = substr($1, 1, length($1)-2)即可适配
  • 若在macOS系统下运行,将代码中的md5sum替换为md5 -r即可正常计算哈希
  • 若需要忽略函数内的空行、注释做模糊匹配,可在计算哈希前先对func_content做过滤处理

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.12 13:21:00