下面是我编写的一些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>
答案 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命令不应该在引号中。