我知道可以使用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/

10-13 07:40