现象
用shell脚本实现一个递归遍历目录树结构的方法,发现只能从第一层目录往下遍历有点奇怪,执行 sh -x <脚本名>
命令在debug调试模式下发现变量的值被改变了. 具体表现就是: 上层函数,调用下层函数的时候,下层函数中的值变了后,再返回上层调用,结果其值没有恢复,即父级函数调用子级函数,子级函数中改变了某变量的值,返回父级函数后,父级函数中的值,也被改变了。
原因
Linux shell中,定义的函数变量,默认是全局global的
,即使是在函数中定义的变量,也是。所以,递归函数中的变量,由于多数都是局部变量,导致下一层调用中修改了某个变量之,返回上一层后,同一个变量的值,也同时被改变了,所以导致运行结果不对。
解决办法
解决办法就是,把(递归函数中的)所有的变量之前加上local
定义,表示局部变量,这样运行的结果,和函数执行逻辑,就和C等其他语言类似,结果也就都正确了。
例如:
# bash:
fun () {
local abc
..
}
# ksh:
fun () {
typeset abc
..
}