最新消息:20210917 已从crifan.com换到crifan.org

【已解决】Linux Shell中,递归函数调用过程中,变量的值被改变,即下层调用会影响上层中的变量的值

Linux crifan 3818浏览 0评论

【问题】

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

转载请注明:在路上 » 【已解决】Linux Shell中,递归函数调用过程中,变量的值被改变,即下层调用会影响上层中的变量的值

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
89 queries in 0.196 seconds, using 20.17MB memory