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等其他语言类似,结果也就都正确了。

 

posted @ 2017-03-15 12:09  cdongyang  阅读(1619)  评论(1编辑  收藏  举报