我正在尝试在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脚本,我不知道如何调试或者我的脚本有什么问题。
答案 0 :(得分:1)
有些遗失的物品是:
如果您有一个目录parent/child/
并运行list_dirs.sh parent/
,则会输出child
。然后,您尝试在当前目录中查找child/
而不是parent/child/
。
您出于调试目的echo $f
和echo $((maxD++))
返回结果。他们互相困惑。使用>&2
将错误和调试消息写入stderr。
echo $((maxD++))
是一个等同于return x++
的经典错误。您返回该数字,然后递增一个不再使用的变量。
[ "$x" -eq "$maxD" ]
毫无意义。使用-ge
,因为您正在尝试查找最大值
这是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))