[Z] 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=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变量。
[Z] Shell中脚本变量和函数变量的作用域的更多相关文章
- Shell脚本中变量和函数变量的作用域
(1)Shell脚本中定义的变量是global的,其作用域从被定义的地方开始,到shell结束或被显示删除的地方为止.(2)Shell函数定义的变量默认是global的,其作用域从“函数被调用时执行变 ...
- shell中脚本变量和函数变量的作用域
http://blog.csdn.net/ltx19860420/article/details/5570902 1. shell脚本中定义的变量是global的,其作用域从被定义的地方开始,到she ...
- Shell中脚本变量的作用域
原文地址:http://blog.csdn.net/abc86319253/article/details/46341839 在shell中定义函数可以使代码模块化,便于复用代码.不过脚本本身的 ...
- shell中脚本与函数的使用策略
脚本:运行的副作用不影响父环境,开辟了fork子进程; 函数:副作用,定义的变量,数据默认直接添加到了调用者的环境,也是它自己的环境;不想副作用影响调用者环境,就必须主动用local修饰; shell ...
- shell中eval命令妙用——变量嵌套替换
eval命令妙用--变量嵌套替换 eval命令在Linux下的应用非常广泛,在写脚本的时候遇到一个变量嵌套的问题,用eval迎刃而解,略试不爽啊. var1="hello" i=1 ...
- shell中命令代换$()与`` 、 变量代换${} 、 整数运算$(( )) 的区别
命令代换$()与`` . 变量代换${} . 整数运算$(( )) 1.$( ) 与 ` ` (反引号) 在 bash shell 中,$( ) 与 ` ` (反引号) 都是用来做命令替换用(comm ...
- JavaScript(1)——变量、函数声明及作用域
这是我的第一篇博客文章,本人不才,文笔也不好,所以可能写的有点凌乱.有什么不对的地方还望见谅.不过每天进步一小步,总有一天会迈出那一大步.以下内容是我对变量.函数声明及函数表达式.作用域的理解. [变 ...
- JavaScript基础&实战(4)js中的对象、函数、全局作用域和局部作用域
文章目录 1.对象的简介 2.对象的基本操作 2.1 代码 2.2 测试结果 3.属性和属性值 3.1 代码 3.2 测试结果 4.对象的方法 4.1 代码 4.2 测试结果 5.对象字面量 5.1 ...
- shell中脚本调试----学习
1.使用dos2unix命令处理在windows下开发的脚本 将windows下编辑的脚本放置到linux下执行的情况如下: [root@ks ~]# cat -v nginx.sh #!/bin/b ...
随机推荐
- 【商业源码】生日大放送-Newlife商业源码分享 -转
http://www.cnblogs.com/asxinyu/p/3225179.html 今天是农历六月二十三,是@大石头的生日,记得每年生日都会有很劲爆的重量级源码送出,今天Newlife群和 ...
- iOS-----解决Prefix Header出错的问题
我们在使用 Prefix Header 预编译文件时有时会遇到如下的报错 clang: error: no such file or directory: '/Users/linus/Dropbox/ ...
- java之继承
措辞 类Y是继承类X == 类X是类Y的父类 == Y IS-A X IS-A测试具有传递性,即:若Y IS-A X,且Z IS-A Y,则Z IS-A X IS-A关系是单向的 条件 为了防止继承被 ...
- swift实现label换行
so easy 换行的实质为在字符串中添加"\n" so, understand???
- MySQL 实用技巧
概述: MySQL有许多实用的技巧,利用这些技巧能提高工作的效率,减少一些不必要的麻烦.以下是几个我在MySQL日常维护从常用的技巧. 一.prompt 命令 功能:设置mysql客户端提示符 说明: ...
- Servlet实现验证码图片(一)
Servlet实现数字字母验证码图片(一): 生成验证码图片主要用到了一个BufferedImage类,如下:
- MkDocs 搭建试用
http://www.mkdocs.org/备注: 在平时的开发中文档管理是一个比较重要的部分,同时集成在 平时开发的持续集成中,可以加速开发 1. 安装 pip install mkdoc ...
- cargo rust 包管理工具
1. 安装 yum 或者官方提供的包,比较简单 curl -sSL https://static.rust-lang.org/rustup.sh | sh 2. 帮助命令 cargo --help U ...
- sqlserver docker 安装部署试用
1. 镜像 docker pull exoplatform/sqlserver 2. 镜像参数 docker run -d -e SA_PASSWORD=<passord> -e ...
- 关于SQL的几道小题详解
关于SQL的几道小题详解 当我们拿到题目的时候,并不是急于作答,那样会得不偿失的,而是分析思路,采用什么方法,达到什么目的,还要思考有没有简单的方法或者通用的方法等等,这样才会达到以一当十的效果,这样 ...