您的位置:首页 > 运维架构 > Shell

Shell中脚本变量的作用域

2015-06-03 10:34 621 查看
转自: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

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



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

此处跟js有点像,在js中,在一个function里面定义变量,如果加上var则是local的,shell中的local关键字就相当于js的var,js中如果不加var,直接定义则是全局的,shell也是。



例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



结果: www.2cto.com

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变量。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: