zoukankan      html  css  js  c++  java
  • [Z] Shell中脚本变量和函数变量的作用域

    在shell中定义函数可以使代码模块化,便于复用代码。不过脚本本身的变量和函数的变量的作用域问题可能令你费解,在这里梳理一下这个问题。


    (1)Shell脚本中定义的变量是global的,其作用域从被定义的地方开始,到shell结束或被显示删除的地方为止。

    例1:脚本变量的作用域
    #!/bin/bash
    #define the function ltx_func
    ltx_func()
    {
       echo $v1
       #modify the variable v1
       v1=200 
    }
    #define the variable v1
    v1=100
    #call the function ltx_func
    ltx_func
    echo $v1

    结果:
    100
    200
    解析:脚本变量v1的作用域从被定义的地方开始,到shell结束。调用函数ltx_func的地方在变量v1的作用域内,所以能够访问并修改变量v1。

    (2)Shell函数定义的变量默认是global的,其作用域从“函数被调用时执行变量定义的地方”开始,到shell结束或被显示删除处为止。函数定义的变量可以被显示定义成local的,其作用域局限于函数内。但请注意,函数的参数是local的。

    例2:函数定义的global变量
    #!/bin/bash
    #define the function ltx_func
    ltx_func()
    {
       #define the variable v2
       v2=200 
    }
    #call the function ltx_func
    ltx_func
    echo $v2

    结果:
    200
    解析:函数变量v2默认是global的,其作用域从“函数被调用时执行变量定义的地方”开始,到shell结束为止。注意,不是从定义函数的地方开始,而是从调用函数的地方开始。打印命令在变量v2的作用域内,所以能够访问变量v2。

    例3:函数定义的local变量
    #!/bin/bash
    #define the function ltx_func
    ltx_func()
    {
       #define the local variable v2
       local v2=200 
    }
    #call the function ltx_func
    ltx_func
    echo $v2

    结果:
    (空)
    解析:函数变量v2显示定义为local的,其作用域局限于函数内。打印命令在函数外,不在变量v2的作用域内,所以能够不能访问变量v2。

    例4:函数参数是local变量
    #!/bin/bash
    #define the function ltx_func
    ltx_func()
    {
       echo "param 1: $1"
    }
    #call the function ltx_func
    ltx_func 100

    结果:
    100
    解析:函数参数是local的,通过位置变量来访问。打印命令输出函数的第一个参数。

    (3)如果同名,Shell函数定义的local变量会屏蔽脚本定义的global变量。

    例5:同名local变量屏蔽global变量
    #!/bin/bash
    #define the function ltx_func
    ltx_func()
    {
       echo $v1
       #define the local variable v1
       local v1=200 
       echo $v1
    }
    #define the global variable v1
    v1=200 
    #call the function ltx_func
    ltx_func
    echo $v1

    结果:
    100
    200
    100
    解析:global变量v1的作用域从被定义的地方开始,到shell结束。调用函数ltx_func的地方在变量v1的作用域内,所以能够变量v1。函数又定义了同名的local变量v1,同名local变量屏蔽global变量,所以函数第二次打印访问的是local变量。退出函数后再次打印v1,此时函数定义的local变量已经消失,访问的是global变量。

  • 相关阅读:
    BZOJ 3744 Gty的妹子序列
    BZOJ 3872 Ant colony
    BZOJ 1087 互不侵犯
    BZOJ 1070 修车
    BZOJ 2654 tree
    BZOJ 3243 向量内积
    1003 NOIP 模拟赛Day2 城市建设
    CF865D Buy Low Sell High
    CF444A DZY Loves Physics
    Luogu 4310 绝世好题
  • 原文地址:https://www.cnblogs.com/waytofall/p/3966032.html
Copyright © 2011-2022 走看看