LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 999|回复: 9

初学shell,请教一个递归问题

[复制链接]
发表于 2007-4-8 23:16:49 | 显示全部楼层 |阅读模式
function makepath()
{
if [[ ${#1} -eq 0 || -d "$1" ]]
then
return 0
fi
if [[ "${1%/*}" = "$1" ]]
then
mkdir $1
return $?
fi
makepath ${1%/*} || return 1  #$1为a的时候,${1%/*}是什么呢?
mkdir $1
return $?
}

set -o xtrace
makepath a/b/c

+ makepath a/b/c
+ [[ 5 -eq 0 ]]
+ [[ -d a/b/c ]]
+ [[ a/b = \a\/\b\/\c ]]
+ makepath a/b
+ [[ 3 -eq 0 ]]
+ [[ -d a/b ]]
+ [[ a = \a\/\b ]]
+ makepath a
+ [[ 1 -eq 0 ]]
+ [[ -d a ]]
+ [[ a = \a ]]
+ mkdir a #这儿的mkdir a是if fi里面的,还是外面的呢?
+ return 0
+ mkdir a/b
+ return 0
+ mkdir a/b/c
+ return 0
发表于 2007-4-8 23:59:00 | 显示全部楼层
没仔细看代码,不过是不是 mkdir -p a/b/c 就可以达到这个目的?
回复 支持 反对

使用道具 举报

发表于 2007-4-9 09:07:44 | 显示全部楼层
mkdir a 是在此处执行的
if [[ "${1%/*}" = "$1" ]]
then
mkdir $1
return $?
fi
此处的用意是,当所要生成的路径不包括/的时候,就直接生成此路径。
这个函数的前两个判断条件都是递归的出口,第一个判断此路径是否存在,第二个判断的是,此路径是否是最上层的路径。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-4-9 20:30:38 | 显示全部楼层
Post by Iambitious
mkdir a 是在此处执行的
if [[ "${1%/*}" = "$1" ]]
then
mkdir $1
return $?
fi
此处的用意是,当所要生成的路径不包括/的时候,就直接生成此路径。
这个函数的前两个判断条件都是递归的出口,第一个判断此路径是否存在,第二个判断的是,此路径是否是最上层的路径。


难道是引号的作用吗?怎么会有这种作用呢?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-4-9 20:34:14 | 显示全部楼层
makepath ${1%/*} || return 1
这一句有什么作用呢
回复 支持 反对

使用道具 举报

发表于 2007-4-9 21:57:16 | 显示全部楼层
如果执行makepath函数不成功,返回1,也就是从上层目录开始只要有一层建立不成功,那么就不再创建底层目录.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-4-10 12:21:37 | 显示全部楼层
Post by Iambitious
如果执行makepath函数不成功,返回1,也就是从上层目录开始只要有一层建立不成功,那么就不再创建底层目录.


+ [[ a = \a ]]
+ mkdir a #这儿的mkdir a是if fi里面的,还是外面的呢?
+ return 0

在makepath a的时候,是不是不成立呢?然后不是返回1吗?怎么是返回0
回复 支持 反对

使用道具 举报

发表于 2007-4-10 13:33:21 | 显示全部楼层
step1:makepath(a/b/c)
不满足终止条件,跳过前两个if语句
step2:makepath(a/b)
不满足终止条件,跳过前两个if语句
step3:makepath(a)
满足终止条件,进入第二个if语句
mkdir a
return 0
step4:返回到makepath(a/b)
mkdir a/b
return 0
step5:返回到makepath(a/b/c)
mkdir a/b/c
return 0

注意return $?是返回前一条命令执行的结果,如果正确执行返回0,否则1。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-4-11 20:27:37 | 显示全部楼层
Post by Iambitious
step1:makepath(a/b/c)
不满足终止条件,跳过前两个if语句
step2:makepath(a/b)
不满足终止条件,跳过前两个if语句
step3:makepath(a)
满足终止条件,进入第二个if语句
mkdir a
return 0
step4:返回到makepath(a/b)
mkdir a/b
return 0
step5:返回到makepath(a/b/c)
mkdir a/b/c
return 0

注意return $?是返回前一条命令执行的结果,如果正确执行返回0,否则1。

那makepath ${1%/*} || return 1后面的return 1好像在这里没什么用啊
回复 支持 反对

使用道具 举报

发表于 2007-4-12 08:58:20 | 显示全部楼层
只有当mkdir命令运行出错的时候,才会return 1
这样就使得下一级的目录不会被建立,举个例子来说
对于目录a/b/c,如果创建目录a/b失败,那么就不会再创建a/b/c了。
具体的过程就是,创建a/b时 mkdir a/b失败,返回$?也就是返回1
所以回到makepath(a/b/c)的时候,由于makepath(a/b)返回1,所以makepath(a/b/c)直接return 1
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表