我的任务是编写一个 bash 脚本,它读取一个目录并返回其中每个文件的文件类型,包括所有子目录。不允许使用 find 命令。我尝试使用两个 for 循环来实现这一点,但我遇到了分段错误。但是,当我传递没有子目录的目录时,我发现该脚本确实有效。有人愿意查看菜鸟的代码并告诉我出了什么问题吗?非常感谢。
#!/bin/bash
func () {
for name in $1
do
if [ -f "$name" ]
then
file "$name"
elif [ -d "$name" ]
then
func "$1"
fi
done
}
directory="$1/*"
for name in $directory
do
if [ -f "$name" ]
then
file "$name"
elif [ -d "$name" ]
then
func "$1"
fi
done
如果
$name
它正在处理的“”是一个目录,你需要调用func
它的内容,而不是原始参数,否则你会得到一个无限循环,因此会出现段错误。通过在原始参数上使用函数可以大大减少您的代码,并将该函数分别应用于每个项目。现在,无论如何,您都在重复主体函数中发生的大部分内容。
如果您可以使用 bash 功能,最简单的方法是启用
globstar
并使用它:使用原始脚本中的逻辑,您只需为其提供正确的输入:
您正在使用
func $1
而不是func $name
因此进入导致段错误的无限循环。下次,只需添加一个echo
以查看您正在处理的内容,这将立即向您显示错误。此外,您真的不需要重复这样的代码。函数的重点是避免这种重复,所以你可以简单地做: