博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【转】Shell中脚本变量和函数变量的作用域
阅读量:6250 次
发布时间:2019-06-22

本文共 1669 字,大约阅读时间需要 5 分钟。

 在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=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变量。

转载地址:http://wgfsa.baihongyu.com/

你可能感兴趣的文章
mysql学习笔记--数据库视图
查看>>
SQL server 2005如何设置一个或几个字段唯一约束?
查看>>
典型用户分析
查看>>
java web编程 servlet读取配置文件参数
查看>>
ChartControl实现时间轴实现
查看>>
生成器函数
查看>>
Google(谷歌)中国工程研究院 工程师 方坤 对学生朋友的一些建议
查看>>
oracle 优化——索引与组合索引
查看>>
android基础—尺寸单位和屏幕适配
查看>>
小试 ScriptManager
查看>>
异常处理
查看>>
C/S模型之消息传输
查看>>
一道int与二进制加减题
查看>>
Java中输入判定的错误和纠正
查看>>
详解Nginx 13: Permission denied 解决方案
查看>>
InPlace Transition of a matrix
查看>>
Project Euler 26 Reciprocal cycles( 分数循环节 )
查看>>
做了几道简单的基础题,慢慢熟悉循环
查看>>
元素的多种延时等待(&页面的超时处理)
查看>>
ios 后台发送邮件之SKPSMTPMessage的使用
查看>>