在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变量。
- 浏览: 5177387 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (756)
- postgreSQL (1)
- 数据库 (18)
- oracle (1)
- Java Web (212)
- ZK框架 (0)
- installanywhere (0)
- linux命令 (51)
- dos cmd (3)
- 随笔_随感 (14)
- Java (290)
- C (1)
- unix (11)
- C++ (0)
- perl (0)
- python (10)
- ruby (2)
- bash (4)
- mysql (8)
- android (5)
- 法律 (0)
- maven ant (2)
- ios (11)
- Continuous integration (3)
- java swing (71)
- java swt (4)
- spring MVC (26)
- javascript (139)
- css (23)
- libgdx (0)
- nginx (9)
- loadruner (0)
- php (5)
- git (9)
- IDEA (6)
- 接口调试神器 (9)
- 数学math (1)
- eclipse (2)
- mac (17)
- freemark (0)
- ajax (1)
- less (1)
- zookeeper (1)
- react (3)
- html5 (3)
- jQuery (1)
- gitlab (2)
- shell (6)
- zsh (1)
- hibernate (6)
- gradle (3)
- groovy (3)
- 分布式锁 (1)
最新评论
-
fanchengliang:
好用,特地登录了来顶
破解 navicat premium 11 -
w_mojian180:
这个方法对于子类来说是没效果的
Spring AOP会忽略从父类继承的方法 -
cremains:
如何使用redis实现分布式锁 -
wangyudong:
没这么麻烦吧,网上找了一个Holer工具,只需要配置一个Acc ...
公网访问局域网内的数据库 -
haoxuexi87:
Jmeter性能测试从入门到精通(2018年最新)课程观看地址 ...
JMeter 接口测试入门01
发表评论
-
使用awk 分析日志
2018-04-22 15:44 1396直接上shell命令: awk 'BEGIN{index2 ... -
使用shell命令查看分析日志(2)
2018-04-21 11:56 1756目标: 查看日志文件中,所有空指针异常发生的位置,及前后1 ... -
使用shell命令查看分析日志
2018-04-21 11:11 4202摘要: 现在网站都有后 ... -
linux shell 条件判断
2017-01-27 23:04 3469linux shell 条件判断 (1)是否等于 if ... -
linux expect常见用法
2017-01-22 13:49 2639linux expect常见用法 expect有什么用呢 ... -
linux shell批量重名了java 类
2016-12-28 17:43 1096linux shell批量重名了java 类 所以的单元 ... -
hosts.deny
2016-12-21 12:21 1345linux 防止攻击的配置: hosts.deny 内 ... -
centos 更新svn 客户端版本
2016-10-17 23:17 2274centos 更新svn 客户端版本 添加源 /etc/ ... -
linux 服务器常用脚本
2016-08-17 22:22 1029linux 服务器常用脚本 (1)nginx 重新加载 ... -
linux ip白名单
2016-03-21 08:56 13528linux ip白名单 配置文件:/etc/hosts.a ... -
安装CentOS7 之后遇到的问题
2016-03-13 13:19 1142我安装的centos7的版本是: CentOS Linux ... -
stub测试时如何接口转发
2016-03-01 15:00 1208stub测试时如何接口转发我们的网站依赖协作方接口(其他部门 ... -
linux 系统如何防止攻击
2016-02-27 14:11 1986linux 系统如何防止攻击 经常看看登录日志:/var/ ... -
sed 常见用法
2016-02-24 18:24 1421sed 常见用法 (1)添加注 ... -
[转]ubuntu 设定永久dns
2016-02-23 15:22 2646通过修改: sudo vi /etc/resolvconf ... -
linux 定时器
2016-02-01 09:25 2534linux 定时器 (1)实例 [root@iZ25t ... -
阿里云主机防止攻击的建议
2016-01-17 23:54 1816阿里云主机防止攻击的建议 (1)关闭不必要的服务 [r ... -
grep命令常见用法
2016-01-17 21:37 2972grep命令常见用法 (1)通过端口号找进程 占用800 ... -
linux 禁止指定ip访问
2016-01-13 23:31 4729linux中如何禁止指定的i ... -
通过命令名称查询进程id
2016-01-10 22:37 2021linux 中如何通过命令名称查询出进程的id呢?\ 例如 ...
相关推荐
说起函数调用,相信大家也不会陌生,然而对于初学Shell的我来说,Shell中函数调用方式却有点让我不太习惯,自己也走了不少的弯路,因为传递参数时出了一个很“自然”的错误,也让我吃了不少的苦头,所以总结一下...
《Shell脚本专家指南》中的大部分脚本已经在以可靠性为关键因素的生产环境下,经历了多年的不断锤炼和改进。因此,《Shell脚本专家指南》对于那些希望在案头放一本案例精选的读者来说,将会是最佳的参考资料。 这里...
数也能像环境变量一样用export到处,如此,函数的作用域就可以扩展到子进程中。 export -f fname Linux export命令用于设置或显示环境变量。 在shell中执行程序时,shell会提供一组环境变量。export可新增,修改...
linux shell 可以用户定义函数,然后在shell脚本中可以随便调用。下面说说它的定义方法,以及调用需要注意那些事项
在Linux系统中进行日常运维或者是编写脚本时,变量是再熟悉不过的了,但这些变量都有哪些类型,具体的用法又有哪些差异呢?本文整理分享给大家: 一、bash变量类型: 本地变量 局部变量 环境变量 位置变量 特殊变量...
linux shell 可以用户定义函数,然后在shell脚本中可以随便调用。下面说说它的定义方法,以及调用需要注意那些事项
4)默认变量是全局的,在函数中变量local指定为局部变量,避免污染其他作用域。 5)有两个命令能帮助我调试脚本:set -e 遇到执行非0时退出脚本,set-x 打印执行过程。 6)写脚本一定先测试再到生产上。 1 获取...
使用export 命令传递一个变量到一个内嵌awk 的脚本中 11-19. 使用getopts 命令来读取传递给脚本的选项/参数. 11-20. "Including"一个数据文件 11-21. 一个没什么用的,source 自身的脚本 11-22. exec 的效果 11-23. ...
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 ...
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 编写多文件...
非官方的Shell脚本风格 33. 杂项 33.1. 交互式和非交互式的shells和脚本 33.2. Shell 包装 33.3. 测试和比较: 另一种方法 33.4. 递归 33.5. 彩色脚本 33.6. 优化 33.7. 各种小技巧 33.8. 安全话题 ...
附录含有完整的函数和定义、命令行开关、特殊变量、常见模块和Perl调试器的列表,全功能的、面向对象的CGI程序,一些有用的脚本,以及很有帮助的HTM教程。 本书非常适合于Perl语言初学者阅读,对于Perl程序员,也有...
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提供了一台可以在UNIX、Windows和...
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 有状态的...
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 ...
8.3.6 变量作用域 8.4 外界变量和交互式网页 8.4.1 PHP从客户端获取信息的方法:外界变量 8.4.2 使用HTTP Form获取信息 8.4.3 HTTP Cookies与客户端信息 8.4.4 使用环境变量获取客户端信息 8.5 基本控制流程:分支和...