转自:  http://blog.csdn.net/ltx19860420/article/details/5570902

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

[转]Shell中脚本变量和函数变量的作用域相关推荐

  1. PHP: 在类(class)中加载动态函数, 变量函数或半变量函数 variable function/method

    最终实例在下方 以前用过cakephp, 他们的数据库查询还是蛮强大的, 后来好奇它的类的写法,比如: <?php $this->Post->findByTitle('My Firs ...

  2. sh执行文件 参数传递_详解shell中脚本参数传递的两种方式

    方式一:$0,$1,$2.. 采用$0,$1,$2..等方式获取脚本命令行传入的参数,值得注意的是,$0获取到的是脚本路径以及脚本名,后面按顺序获取参数,当参数超过10个时(包括10个),需要使用${ ...

  3. while读取文件 Shell中while循环的陷阱, 变量实效, 无法赋值变量

    在写while循环的时候,发现了一个问题,在while循环内部对变量赋值.定义变量.数组定义等等环境,在循环外面失效. 一个简单的测试脚本如下: #!/bin/bash echo "abc ...

  4. shell中的命令替换和变量替换

    一.命令替换 可以用'command', 也可以用$(command). 二者是有区别的,先看一下'command'(注意:这里不是引号,而反引号) 1. `command' 用来做命令替换 2. $ ...

  5. SHELL中的引用之引用变量

    引号的特殊效果就是,保护字符串中的特殊字符不被shell 或者是shell 脚本重新解释或者扩展. (这里所说的"特殊"指的是一些字符在shell 中具有的特殊意义,比如*) 在我 ...

  6. matlab 报错 保留变量,matlab中明明定义了函数变量总是报错

    matlab定义符号函数 functiony=ff(t)t=input('t=');ift>=0y=sym('1');elsey=sym('0');end matlab中如何定义函数 matla ...

  7. 变量在函数内外的作用域 3

    <?phpfunction increment($value,$amount = 1) { $value = $value +$amount; }$value = 10; increment ( ...

  8. 子shell中使用相关的环境变量

  9. Shell中常用的系统函数basename和dirname

    shell编程和其他编程语言一样,有系统函数,也可以自定义函数. basename命令 basename功能: 返回完整路径最后/的部分,常用于获取文件名basename [pathname][suf ...

最新文章

  1. linux下常用命令之nc
  2. 机甲才是男人的浪漫 这款Python版免费战争机甲类游戏,“白拿党”还在等什么?(超帅气)
  3. python安装环境安装_安装Python运行环境
  4. 在华为鸿蒙OS上尝鲜,我的第一个“hello world”
  5. [剑指offer][JAVA]面试题第[15]题[二进制中1的个数][位运算]
  6. androidpn的一次亲密接触(二)
  7. 无人机-2多翼无人机的结构与硬件
  8. 王珊数据库系统概论第五版视频课程
  9. 台式计算机开关电源原理图,开关电源电路原理(附原理图)
  10. PS全套抠图技法教程,快速抠头发/抠婚纱,带配套素材
  11. python当行刷新
  12. 常见的几个接口管理平台简介
  13. Matlab/simulink 风电风机一次调频,变桨控制,变风速调频对比,转子动能控制,虚拟惯性控制,风机内部控制详细,频域模型,DFIG,PMSG
  14. 2020腾讯、百度、华为Android面试题校招汇总(已拿offer
  15. 自控原理学习笔记-反馈控制系统的动态模型(4)-频率特性函数Nyquist图及Bode图
  16. IT硬件名人堂:40年经典产品和背后的故事(组图)
  17. php 蓝奏网盘上传文件,教给大家一个蓝奏云高级玩法,如何把文件一键秒上传到蓝奏云网盘...
  18. EVE-NG配置静态固定地址
  19. 更换网站服务器对网站优化有影响吗?
  20. 【超简单实用教程】mkv、flv格式转mp4格式(附网盘资源)

热门文章

  1. 【django】创建django项目工程
  2. python—多线程定义和创建(一)
  3. optee中User TA的加载/验签和运行
  4. 基础知识——密码学笔记(一)
  5. C++简单使用priority_queue
  6. 2.API的调用过程(3环进0环)
  7. 【Prometheus】prometheus生成快照,并冷备份数据,恢复数据
  8. grafana—— worldPing APP 中文
  9. 6、mysqldump备份数据库(附带实例)
  10. Codeforces Round #481 (Div. 3)【完结】