我的任务是编写一个 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
答案1
如果它$name
正在处理的“ ”是一个目录,则需要调用func
其内容,而不是原始参数,否则会出现无限循环,从而出现段错误。
通过在原始参数上使用函数,并将该函数分别应用于每个项目,可以大大减少您的代码。无论如何,现在您正在重复主体函数中发生的大部分事情。
#!/bin/bash
func () {
local arg="$1"
if [[ -f "$arg" ]] ; then
file -- "$arg"
return
fi
if [[ -d "$arg" ]] ; then
for file in "$arg"/* ; do
func "$file"
done
fi
}
func "$1"
答案2
如果您可以使用 bash 功能,最简单的方法是启用globstar
并使用它:
shopt -s globstar
for f in "$1"/**; do
if [ -f "$f" ]; then
file -- "$f"
fi
done
使用原始脚本中的逻辑,您只需为其提供正确的输入:
#!/bin/bash
func () {
for name in "$1"/*
do
if [ -f "$name" ]
then
file "$name"
elif [ -d "$name" ]
then
func "$name"
fi
done
}
directory="$1"
for name in "$directory"/*
do
if [ -f "$name" ]
then
file "$name"
elif [ -d "$name" ]
then
func "$name"
fi
done
你使用的是func $1
而不是func $name
所以你进入了一个无限循环,导致了段错误。下次,只需添加一个echo
即可查看您正在处理的内容,这会立即向您显示错误。
另外,您确实不需要重复这样的代码。函数的重点是避免这种重复,所以你可以简单地这样做:
#!/bin/bash
func () {
for name in "$1"/*
do
echo "FF $name"
if [ -f "$name" ]
then
file "$name"
elif [ -d "$name" ]
then
func "$name"
fi
done
}
directory="$1"
for name in "$directory"/*
do
func "$name"
done