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

SIGSEGV无限函数循环问题:Bash递归遍历脚本报错排查

排查你的Bash脚本SIGSEGV(无限递归)问题

首先,你的脚本触发SIGSEGV是因为无限递归调用,同时还有几个文件匹配和遍历逻辑的错误,我来逐个拆解:

核心问题:无限递归

在处理子目录时,你递归调用的是search "$1",而不是当前遍历到的子目录"$x"。这意味着每次递归都会重新处理最初传入的根目录,永远不会终止,最终导致栈溢出触发SIGSEGV信号。

其他关键错误

  1. 文件名匹配逻辑错误
    [ "$x" == "*.sh" ]是在精确匹配字符串*.sh,而不是匹配所有后缀为.sh的文件。应该用[[ "$x" == *.sh ]](不需要引号,通配符才能生效),或者结合后缀判断逻辑。

  2. 遍历目录的方式错误
    for x in $1只会把传入的目录名作为单个循环项,而不是遍历目录下的所有内容。正确的写法应该是for x in "$1"/*,这样才能拿到目录里的每个文件/子目录。

  3. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:24:39