我试图在bash中实现一个函数,它显示给定深度的文件/目录树。它需要3个参数。
$1 = *current directory*
$2 = *current depth*
$3 = *lines*
例如,如果我的当前目录是" ... / living /",我的深度是2,我的函数应输出:
DIR .../living/
----DIR animals
--------FILE dog
--------FILE cat
----DIR plants
--------FILE flowers
如您所见,每次深度变化的线数增加4。文件类型(DIR,FILE)不是此线程的问题。 这就是我到目前为止所拥有的:
function tree {
#some code to get the directory in variable cwd
...
a=$(getType $cwd)
echo "$a $cwd"
depth=3 #the value does not matter, it's just for you guys to see
drawTree $cwd $depth "----"
}
function drawTree {
if [[ $2 == 0 ]]; then
return
fi
dat=$1
list=$(ls $dat)
depth=$2
lines=$3
for d in $list; do
f="$dat/$d"
t=$(getType $f)
echo "$lines$t $d"
if [[ $t == "DIR" ]]; then
g=$(($depth-1))
l="$lines----"
if [[ $g > 00 ]]; then
drawTree $f $g $l
fi
fi
done
这段代码的输出很遗憾,我不明白为什么。
答案 0 :(得分:0)
该代码存在很多问题。
最严重的是你的变量不是本地的(参见help local
),这在递归函数中可能是灾难性的。在drawtree
的循环中,第二次迭代会看到对$depth
和$lines
的不必要修改,这两种修改都会导致输出以不同方式出错。
此外:
g=$(($depth-1))
l="$lines----"
if [[ $g > 00 ]]; then
drawTree $f $g $l
fi
如果没有那么多不必要的变量,使用算术而不是字符串比较,写得好得多:
if (( depth > 1 )); then
drawTree $f $((depth - 1)) ${lines}----
fi
最后:
list=$(ls $dat)
for d in $list; do
如果文件路径中有空格或shell元字符,将会失败。更好的是使用bash数组和glob扩展而不是ls
命令):
# Create an array from a glob
list=("$dat"/*)
# Use the elements of the array, individually quoted:
for d in "${list[@]}"; do