SIGSEGV无限功能循环

时间:2018-03-28 05:22:42

标签: bash

下面是我编写的一些bash代码,其任务是搜索作为命令行参数给出的目录。它将继续并连接.sh扩展名的文件,忽略任何其他文件,但如果有目录,它也将搜索该目录。

#!/bin/bash

counter=0

function search() {
    for x in $1; do
        if [ "$x" == "*.sh" ]; then
            'let counter++'     
            echo "$x":
            cat "$x"
        elif [[ -d "$x" ]]; then
            search "$1";
        fi
    done 
}

search "$1"

if [ $counter -eq 0 ]; then
  echo No files
fi 

当我运行bash脚本时,我得到一个代码为11的SIGSEGV - Segmentation fault。研究让我觉得这是由于我的函数无限循环,但我不知道我可以无限循环。

我通过ShellCheck运行我的代码并且没有检测到任何问题,我已经查看了使用函数的语法,我认为我是正确的函数,实际上我只是迷失了为什么我有一个无限循环。< / p>

1 个答案:

答案 0 :(得分:0)

主要问题是你在$ 1上递归,你应该使用$ x。难怪它是一个无限循环!但是还有其他一些错误。

#!/bin/bash
counter=0

function search() {
    cd "$1"
    for x in *; do
        if [[ "$x" = *.sh ]]; then
            let counter++
            echo "$x":
            # cat "$x"
        elif [ -d "$x" ]; then
            search "$x";
        fi
    done
    cd ".."
}

search "$1"
echo $counter files found

因此,您需要循环遍历*(所有文件)才能查看目录。并且您需要使用[[]]进行模式匹配,并且模式不能用引号括起来。还要注意我们如何cd进入目录并再次备份。 let命令不应该在引号中。