`

【转】Shell中脚本变量和函数变量的作用域

阅读更多

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

分享到:
评论

相关推荐

    Shell中的函数、函数定义、作用域问题介绍

    说起函数调用,相信大家也不会陌生,然而对于初学Shell的我来说,Shell中函数调用方式却有点让我不太习惯,自己也走了不少的弯路,因为传递参数时出了一个很“自然”的错误,也让我吃了不少的苦头,所以总结一下...

    Shell脚本专家指南

    《Shell脚本专家指南》中的大部分脚本已经在以可靠性为关键因素的生产环境下,经历了多年的不断锤炼和改进。因此,《Shell脚本专家指南》对于那些希望在案头放一本案例精选的读者来说,将会是最佳的参考资料。 这里...

    学习笔记《LINUX+SHELL脚本攻略》Sarath Lakshman

    数也能像环境变量一样用export到处,如此,函数的作用域就可以扩展到子进程中。 export -f fname Linux export命令用于设置或显示环境变量。 在shell中执行程序时,shell会提供一组环境变量。export可新增,修改...

    linux shell自定义函数(定义、返回值、变量作用域)介绍

    linux shell 可以用户定义函数,然后在shell脚本中可以随便调用。下面说说它的定义方法,以及调用需要注意那些事项

    Linux bash Shell中的变量类型详解

    在Linux系统中进行日常运维或者是编写脚本时,变量是再熟悉不过的了,但这些变量都有哪些类型,具体的用法又有哪些差异呢?本文整理分享给大家: 一、bash变量类型: 本地变量 局部变量 环境变量 位置变量 特殊变量...

    linux shell 自定义函数方法(定义、返回值、变量作用域)

    linux shell 可以用户定义函数,然后在shell脚本中可以随便调用。下面说说它的定义方法,以及调用需要注意那些事项

    分享9个实战及面试常用Linux Shell脚本编写

    4)默认变量是全局的,在函数中变量local指定为局部变量,避免污染其他作用域。 5)有两个命令能帮助我调试脚本:set -e 遇到执行非0时退出脚本,set-x 打印执行过程。  6)写脚本一定先测试再到生产上。 1 获取...

    Advanced Bash-Scripting Guide <>

    使用export 命令传递一个变量到一个内嵌awk 的脚本中 11-19. 使用getopts 命令来读取传递给脚本的选项/参数. 11-20. "Including"一个数据文件 11-21. 一个没什么用的,source 自身的脚本 11-22. exec 的效果 11-23. ...

    CentOS.5系统管理-part1

    4.9.2 Shell变量的作用域 4.9.3 环境变量 4.9.4 用户工作环境 第5章 Shell脚本编程 5.1 Shell脚本简介 5.1.1 什么是Shell脚本 5.1.2 Shell脚本中的成分 5.1.3 Shell脚本的建立与执行 5.1.4 Shell脚本的编码规范 5.2 ...

    Linux C程序设计大全

    3.2 变量的作用域和生命期 3.2.1 全局变量 3.2.2 局部变量 3.3 变量的初始值 3.3.1 全局变量的初始值 3.3.2 局部变量的初始值 3.4 与函数有关的优化 3.4.1 函数调用与程序优化 3.4.2 变量存储优化 3.5 编写多文件...

    Linux高级bash编程

    非官方的Shell脚本风格 33. 杂项 33.1. 交互式和非交互式的shells和脚本 33.2. Shell 包装 33.3. 测试和比较: 另一种方法 33.4. 递归 33.5. 彩色脚本 33.6. 优化 33.7. 各种小技巧 33.8. 安全话题 ...

    Perl 实例精解(第三版).pdf

    附录含有完整的函数和定义、命令行开关、特殊变量、常见模块和Perl调试器的列表,全功能的、面向对象的CGI程序,一些有用的脚本,以及很有帮助的HTM教程。 本书非常适合于Perl语言初学者阅读,对于Perl程序员,也有...

    宋劲彬的嵌入式C语言一站式编程

    4. 全局变量、局部变量和作用域 4. 分支语句 1. if语句 2. if/else语句 3. 布尔代数 4. switch语句 5. 深入理解函数 1. return语句 2. 增量式开发 3. 递归 6. 循环语句 1. while语句 2. do/while语句 3. for语句 4. ...

    Tcl_TK编程权威指南pdf

    该函数库实现了基本的解释器,它有一套实现变量、流程控制和过程的核心脚本命令,而且还有一组用来存取操作系统服务以运行其他程序、存取文件系统和使用网络套接字的命令。Tcl和Tk提供了一台可以在UNIX、Windows和...

    写给大忙人看的JAVA SE 8

    1.6 变量作用域 10 1.7 默认方法 14 1.8 接口中的静态方法 17 练习 18 第2章 Stream API 20 2.1 从迭代器到Stream操作 22 2.2 创建Stream 23 2.3 filter、map和flatMap方法 25 2.4 提取子流和组合流 26 2.5 有状态的...

    RED HAT LINUX 6大全

    6.2 初始化进程和启动脚本 90 6.2.1 init和/etc/inittab 90 6.2.2 /etc/inittab和系统状态 92 6.3 linuxconf与管理服务 96 6.4 关闭Linux系统 98 6.4.1 shutdown 98 6.4.2 halt与reboot 99 6.5 当系统崩溃时 100 ...

    LINUX网站建设技术指南

    8.3.6 变量作用域 8.4 外界变量和交互式网页 8.4.1 PHP从客户端获取信息的方法:外界变量 8.4.2 使用HTTP Form获取信息 8.4.3 HTTP Cookies与客户端信息 8.4.4 使用环境变量获取客户端信息 8.5 基本控制流程:分支和...

Global site tag (gtag.js) - Google Analytics