我知道可以使用ls -R path
完成。但是我试图学习shell语言的语法和控制结构,所以我试图编写自己的代码:
#!/bin/sh
arg=$1;
lsRec() {
for x in $1*; do
if [ -d "$x" ]; then
lsRec $x;
else
echo "$x";
fi
done
}
lsRec $arg;
当我调用
./ej2.sh ~/Documents/
命令时,终端会抛出:segmentation fault (core dumped)
。为什么我会收到此错误?,我的代码中是否缺少某些内容?谢谢。
最佳答案
您的算法正在进入无限循环,因为lsRec
函数隐式地期望其参数以“/”结尾。一级有效,因为您传递以“/”结尾的路径作为输入,但第二级则无效,因为您进行递归调用的路径并不以“/”结尾。您可以做的是在进行递归调用时添加斜杠,使其看起来像lsRec $x/
,或者(更好)在循环参数中添加斜杠,就像for x in $1/*; do
一样(因为系统通常会忽略多个相邻的路径分隔符)。
展望 future ,我建议您使用引号(例如for x in "$1/"*
,lsRec "$x"
,lsRec "$arg"
)来避免路径包含空格字符时出现问题。当您创建一个目录时,在要扫描的目录层次结构中其名称中带有空格的目录时,您将到达该目录。
关于linux - 递归列出Bash中给定目录中的文件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38945927/