如何在多个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
相关产品推荐
相关产品推荐

