转载来自:http://www.2cto.com/os/201301/182260.html 代码已经被博主验证!
在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(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。
例4shell脚本中函数参数也是属于local的
(3)如果同名,Shell函数定义的local变量会暂时屏蔽脚本定义的global变量,退出函数后,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=100 #call the function ltx_func ltx_func echo $v1结果:
100 200 100