递归函数返回目录深度

时间:2017-05-08 22:21:20

标签: linux bash shell unix

我正在尝试在bash中编写递归脚本,以单个路径作为参数接收并打印以此路径为根的目录树的深度。

这是long y=Long.parseLong(x); 脚本:

list_dirs.sh

这是ls -l $dir | grep dr..r..r.. | sed 's/.*:...\(.*\)/\1/' 脚本:

isdir.sh

他们都很好。

这是我写的不起作用的脚本if [ -d $1 ]; then echo 1 elif [ -e $1 ]; then echo 0 else echo -1 fi

dir_depth.sh

我真的很喜欢bash脚本,我不知道如何调试或者我的脚本有什么问题。

1 个答案:

答案 0 :(得分:1)

有些遗失的物品是:

  1. 如果您有一个目录parent/child/并运行list_dirs.sh parent/,则会输出child。然后,您尝试在当前目录中查找child/而不是parent/child/

  2. 您出于调试目的echo $fecho $((maxD++))返回结果。他们互相困惑。使用>&2将错误和调试消息写入stderr。

  3. echo $((maxD++))是一个等同于return x++的经典错误。您返回该数字,然后递增一个不再使用的变量。

  4. [ "$x" -eq "$maxD" ]毫无意义。使用-ge,因为您正在尝试查找最大值

  5. 这是dir_depth.sh,其中包含以下更改:

    if [ $# -eq 0 ]; then
      echo "Usage: ./dir_depth.sh <path>" >&2
      exit 1
    fi
    
    x=`source ./isdir.sh $1`
    if [ $x -eq -1 ]; then
      echo "no such path $1" >&2
    fi
    dir=$1
    
    dirs=`source ./list_dirs.sh`
    maxD=0
    for f in $dirs
    do
      if [ $x -ne 0 ]; then
        x=`./dir_depth.sh "$1/$f"`
        if [ "$x" -ge "$maxD" ]; then
          maxD="$x";
        fi
      fi
      echo $f >&2
    done
    echo $((maxD+1))