中文第2版第5章流程控制 Page 157
以下2个函数,recls调用递归函数recdir实现简单的tree功能
recdir ()
{
tab=$tab$singletab
for file in "$@"; do
echo -e $tab$file
dir=$dir/$file
if [ -d $dir ]; then
recdir $(command ls $dir)
fi
dir=${dir%/*}
done
tab=${tab%\\t}
}
recls ()
{
singletab="\t"
for tryfile in "$@"; do
echo $tryfile
if [ -d $tryfile ]; then
dir=$tryfile
recdir $(command ls $tryfile)
fi
done
unset dir singletab tab
}
实现效果如下:
# recls /boot
/boot
config-2.6.18-164.el5
grub
device.map
e2fs_stage1_5
fat_stage1_5
ffs_stage1_5
grub.conf
iso9660_stage1_5
jfs_stage1_5
menu.lst
minix_stage1_5
reiserfs_stage1_5
splash.xpm.gz
stage1
stage2
ufs2_stage1_5
vstafs_stage1_5
xfs_stage1_5
initrd-2.6.18-164.el5.img
message
symvers-2.6.18-164.el5.gz
System.map-2.6.18-164.el5
vmlinuz-2.6.18-164.el5
要求修改代码的功能,以提高其输出能力,如下:
1. 判断是否是文件或目录,改变输出结果,使每个目录名在显示时后面附加符号/。
2. 修改代码使其最多向下循环8个子目录(即最大不超过屏幕的最右边)。
提示:考虑TAB的实现过程。
3. 改变输出使其包含短线划线并在每个目录后面加入空行,这样,
./
|-------ascript
|-------bash2examples.tar.gz
|-------bashdb
|-------bashdb.pre
|-------bash.tar.Z
|-------debugger/
| |
| |-------bashdb
| |-------bashdb.fns
| |-------bashdb.pre
|-------examples/
| |
| |-------chapter4/
| | |
| | |-------albums
| | |-------ascript
完成如下:
:
recdir ()
{
tab=$tab$singletab
for file in "$@"; do
cnt=$#
dir=$dir/$file
if [ -d $dir ]; then
echo -e ${tab/%\\t/$bar}$file/ # TAB替换为横杠
if [ "`ls $dir|wc -l`" -ne 0 ]; then
echo -e $tab$stick # 非空目录才有分支的竖杆
fi
recdir $(command ls $dir)
else
echo -e ${tab/%\\t/$bar}$file
fi
dir=${dir%/*}
done
tab=${tab%|\\t}
}
recls ()
{
singletab="|\t"
stick="|"
bar="-------"
for tryfile in "$@"; do
if [ -d $tryfile ]; then
echo $tryfile/
dir=$tryfile
recdir $(command ls $tryfile)
else
echo $tryfile
fi
done
unset dir singletab stick bar tab
}
第2个问题未完成,主要问题在于要找到屏幕宽度的像素。
阅读(1811) | 评论(0) | 转发(0) |