*关于函数中的一些变量的时效性*

今天在写脚本的时候,在同事的提示下,我才明白shell中原来一个变量的设置在当前这个脚本中是一直生效的,也就是说作用范围是全局性的,你要是不用的话就在该函数结束的时候unset 变量。

【注意:不要加$哦~】 

例如:

app{

sum=1

unset sum

}

或者用以下的方式:

app{

local sum=123

}

如果要是不这样子做的话,在一个脚本中你多次用到一个变量的话,就会出问题,比如说我们常用的i

for (i=0;i<$length;i++)

假如脚本中多次用到的话,你发现这个i可能是上个函数循环结束后得到的结果~

ps:

因为之前本人学过一点C++啦,那个里面是函数中的变量只在单个函数中生效,所以才会有此问题~

下面是我转载的一篇文章:

在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

结果:
param 1: 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=100
#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变量。

如果将函数中的local去掉的话,输出结果为100,200,200

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值