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

  • 相关阅读:
    Linux下Tomcat服务器-maven项目部署
    数据库设计感悟
    数据库设计规范
    从零到一: 代码调试
    Java泛型与反射的综合应用
    Eclipse中,tomcat插件方式启动项目
    集合查询表--Map
    集合线性表--List之LinkedList(队列与栈)
    集合线性表--List之ArrayList
    Java中的日期操作
  • 原文地址:https://www.cnblogs.com/cdyboke/p/6553530.html
Copyright © 2020-2023  润新知