SIGSEGV无限函数循环问题:Bash递归遍历脚本报错排查
排查你的Bash脚本SIGSEGV(无限递归)问题
首先,你的脚本触发SIGSEGV是因为无限递归调用,同时还有几个文件匹配和遍历逻辑的错误,我来逐个拆解:
核心问题:无限递归
在处理子目录时,你递归调用的是search "$1",而不是当前遍历到的子目录"$x"。这意味着每次递归都会重新处理最初传入的根目录,永远不会终止,最终导致栈溢出触发SIGSEGV信号。
其他关键错误
文件名匹配逻辑错误
[ "$x" == "*.sh" ]是在精确匹配字符串*.sh,而不是匹配所有后缀为.sh的文件。应该用[[ "$x" == *.sh ]](不需要引号,通配符才能生效),或者结合后缀判断逻辑。遍历目录的方式错误
for x in $1只会把传入的目录名作为单个循环项,而不是遍历目录下的所有内容。正确的写法应该是for x in "$1"/*,这样才能拿到目录里的每个文件/子目录。let命令的语法错误'let counter++'用了单引号包裹,这会让Shell尝试执行名为let counter++的命令(而不是执行let命令并传入counter++参数),直接去掉单引号即可:let counter++。
修正后的脚本
#!/bin/bash counter=0 function search() { # 遍历当前目录下的所有内容 for x in "$1"/*; do # 跳过不存在的文件(比如目录为空时,"$1"/*会变成字面量) [[ ! -e "$x" ]] && continue # 匹配.sh后缀的文件 if [[ "$x" == *.sh ]]; then let counter++ echo "=== $x ===" cat "$x" echo -e "\n---分割线---\n" # 如果是子目录,递归处理 elif [[ -d "$x" ]]; then search "$x" fi done } # 检查传入的目录是否存在 if [[ ! -d "$1" ]]; then echo "错误:指定的目录不存在" exit 1 fi search "$1" if [[ $counter -eq 0 ]]; then echo "未找到任何.sh文件" fi
额外优化点
- 增加了目录存在性检查,避免传入无效路径的情况
- 处理了目录为空时的
"$1"/*字面量问题 - 增加了分割线,让合并后的内容更易读
内容的提问来源于stack exchange,提问作者user9213141
相关产品推荐
相关产品推荐

