shell 递归变量改变问题

【问题】html

在折腾一个linux shell脚本,写了个递归嵌套的函数,可是运行过程当中,发现一个问题是,linux

上层函数,调用下层函数的时候,下层函数中的值变了后,再返回上层调用,结果其值没有恢复,即父级函数调用子级函数,子级函数中改变了某变量的值,返回父级函数后,父级函数中的值,也被改变了。shell

【解决过程】bash

1.折腾了好半天,结果始终没有眉目。ide

2.后来无心间找到这里:函数递归,则看到了具体的解释:函数

问:函数递归

在bash shell中递归函数中的变量的问题! 
是否是在整个递归调用的过程当中,使用同一名称的变量就是同一个变量。换句话说就是在下一层的调用中修改了变量var,当返ui

回上层时,上层的var的值也被修改了。this

 

答:spa

为防止下层的修改对上层的影响, 对 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..net

而后本身去试了下,果真就能够解决此问题了。

【总结】

Linux shell中,定义的函数变量,默认是全局global的,即便是在函数中定义的变量,也是。

因此,递归函数中的变量,因为多数都是局部变量,致使:

下一层调用中修改了某个变量之,返回上一层后,同一个变量的值,也同时被改变了,

因此致使运行结果不对。

解决办法就是,把(递归函数中的)全部的变量以前加上local定义,表示局部变量,这样运行的结果,和函数执行逻辑,就和C等其余语言相似,结果也就都正确了。

相关文章
相关标签/搜索