shell 递归变量改变问题
【问题】
在折腾一个linux shell脚本,写了个递归嵌套的函数,但是运行过程中,发现一个问题是,
上层函数,调用下层函数的时候,下层函数中的值变了后,再返回上层调用,结果其值没有恢复,即父级函数调用子级函数,子级函数中改变了某变量的值,返回父级函数后,父级函数中的值,也被改变了。
【解决过程】
1.折腾了好半天,结果始终没有眉目。
2.后来无意间找到这里:函数递归,则看到了具体的解释:
问:函数递归
在bash shell中递归函数中的变量的问题!
是不是在整个递归调用的过程中,使用同一名称的变量就是同一个变量。换句话说就是在下一层的调用中修改了变量var,当返回上层时,上层的var的值也被修改了。
答:
为防止下层的修改对上层的影响, 对 function 中的 variable 要限制为 local 的。
bash:
fun () {
local abc
..
}
ksh:
fun () {
typeset abc
..
}
[quote]原帖由 "寂寞烈火"]由于用递归函数,好像对于脚本效能不是很好的,有本书说尽量避免过多的使用递归(忘了哪本书了)[/quote 发表:
Page 310 in << Advanced Bash−Scripting Guide >> :
[quote]Local variables permit recursion, but this practice generally involves much computational overhead and
is definitely not recommended in a shell script.
然后自己去试了下,果然就可以解决此问题了。
【总结】
Linux shell中,定义的函数变量,默认是全局global的,即使是在函数中定义的变量,也是。
所以,递归函数中的变量,由于多数都是局部变量,导致:
下一层调用中修改了某个变量之,返回上一层后,同一个变量的值,也同时被改变了,
所以导致运行结果不对。
解决办法就是,把(递归函数中的)所有的变量之前加上local定义,表示局部变量,这样运行的结果,和函数执行逻辑,就和C等其他语言类似,结果也就都正确了。