文档章节

第6章创建函数-----------(在函数中使用变量、向函数传递参数、在函数中处理变量、关键字local)

henni_719
 henni_719
发布于 2017/04/22 17:19
字数 1195
阅读 3
收藏 0

6.3在函数中使用变量

         在函数中使用变量,应当多注意如何定义和处理这些变量。

6.3.1向函数传递参数

         函数可以使用标准参数环境变量来表示命令行传递给函数的参数。例如,函数名在变量$0中定义,函数命令行的其他参数使用变量$1和$2等定义。专用变量$#可以用来确定传递给函数的参数数目。在脚本中指定函数时,必须在函数所在命令行提供参数值。

         该函数才可以使用参数环境变量获取参数值。操作实例如下所示:        

#!/bin/bash
#给函数传递参数
#对只有一个参数和两个参数的求和
function addem {
   if [ $# -eq 0 ] || [ $# -gt 2 ]
   then
        echo -1
   elif [ $# -eq 1 ]
   then
	echo $[ $1 + $1 ]
   else
	echo $[ $1 + $2 ]
   fi
}

echo -n "Adding 10 and 15:"
value=`addem 10 15`
echo $value

echo -n "Let's try add just one number:"
value=`addem 10`
echo $value

echo -n "Now trying adding no numbers:"
value=`addem abc`
echo $value

echo -n "Finally,try adding three numbers:"
value=`addem 10 15 20`
echo $value

         函数addem首先检查传递给它的参数数目。如果没有任何参数,或者参数数目超过两个,那么返回值为-1。如果只有一个参数,那么这个参数与自己相加作为结果。如果有两个参数,那么两个参数相加作为结果。由于函数为自己的参数值使用专用的参数环境变量,所以函数无法从脚本命令行直接访问脚本参数值

6.3.2 在函数中处理变量

         变量作用域是shell脚本程序员遇到的常见问题。作用域是变量的可见区域。函数内定义的变量与普通变量有不同的作用域,前者能被脚本外部定义的变量所覆盖

         函数使用两种类型的变量:全局变量、局部变量

         1.全局变量

         全局变量是在shell脚本中处处有效的变量。同样,如果在函数内部定义了全局变量,那么脚本的主代码也可以获取该变量的值。默认情况下,脚本中定义的变量都是全局变量。在函数外部定义的变量,在函数内部仍能正常访问。        

#!/bin/bash
#使用全局变量传值

#定义一个函数
function db1 {
   value=$[ $value * 2 ]
}

#从键盘输入一个值,并把值赋给全局变量value
read -p "Enter a value:" value
#调用函数db1
db1
#输入计算后的结果
echo "The doubling value is :$value"

         变量$value在函数外部定义,并在函数外部赋值。当调用函数db1时,这个变量及其数据在函数内部任然有效。该变量在函数内部赋值之后,它的新数据在引用该变量时仍然有效。这种做法存在一定的风险,尤其对多个shell脚本共用的函数。这种做法要求程序员确切清楚函数中使用了那些变量,包括那些用于计算值且不返回脚本的所有变量。操作实例如下:       

#!/bin/bash
#变量差的使用方法展示
#变量多重定义
function func1 {
   temp=$[ $value +5 ]
   result=$[ $temp *2 ]
}

#定义全局变量temp,value
temp=4
value=6
echo "Before call func1 ,The temp:$temp"
#调用函数
func1
echo "The result is $result"
echo "After call func1 ,The temp:$temp"
#两个变量比较大小
if [ $temp -gt $value ]
then
   echo "temp is larger"
else
   echo "temp is smaller"
fi

         变量temp已经在函数内部使用,而又在函数外部赋值,所以生成的结果会出人意料。全局变量保存最后一次运算结果的值。

         2.局部变量

         函数内部使用的变量可以称为局部变量。这只需要在变量声明前加上关键字:local temp。也可以给局部变量赋值语句前加上local关键字:local temp=$[ $value +5 ]

         关键字local确保变量仅在函数内部使用。如果脚本在函数外部有同名变量,那么shell将能区分开这两个变量。可以很容易地将函数变量与脚本变量区分开来,而只共享需要的变量。具体的操作实例如下:         

#!/bin/bash
#变量差的使用方法展示
#在函数内部定义局部变量
function func1 {
   local temp=$[ $value +5 ]
   result=$[ $temp *2 ]
}

#定义全局变量temp,value
temp=4
value=6
echo "Before call func1 ,The temp:$temp"
#调用函数
func1
echo "The result is $result"
echo "After call func1 ,The temp:$temp"
#两个变量比较大小
if [ $temp -gt $value ]
then
   echo "temp is larger"
else
   echo "temp is smaller"
fi

© 著作权归作者所有

henni_719
粉丝 2
博文 466
码字总数 343938
作品 0
信阳
QA/测试工程师
私信 提问
【JS 口袋书】第 1 和 2 章:JS简介及基础

作者:valentinogagliardi 译者:前端小智 来源:github 阿里云最近在做活动,低至2折,有兴趣可以看看: promotion.aliyun.com/ntms/yunpar… 为了保证的可读性,本文采用意译而非直译。 第...

前端小智
10/08
0
0
Python核心编程:第十一章

11.1什么是函数 函数是对程序逻辑进行结构化或过程化的一种编程方法 11.1.1函数 VS过程 函数返回一个非零或者零值,而过程是简单、特殊、没有返回值的函数 python的过程就是函数,因为解释器...

finndai
2016/10/23
28
0
shell script中创建函数

1.基本的脚本函数 1.1创建函数 创建函数有2中格式: 1.2使用函数 直接引用函数名,函数定义必须在引用之前。函数名必须唯一,否则函数会被新的创建的同名函数覆盖掉,而不会报错。 1.3函数返...

Caishu
2016/05/20
81
0
简单的Shell函数实例

一、Shell函数 本教程目前为止所有脚本都是从头到尾执行。这样做很好,但你也许已经注意到有些脚本段间互相重复。 shell允许将一组命令集或语句形成一个可用块,这些块称为shell函数。 shel...

binhu
2015/12/22
124
0
fluent python-第 7 章 函数装饰器和闭包(附:第 6 章 使用一等函数实现设计模 式)

第 6 章 使用一等函数实现设计模式 本章小结 很多情况下, 在 Python 中使用函数或可调用对象实现回调更自然, 这比模仿 Gamma、 Helm、 Johnson 和 Vlissides 在书中所述的“策略”或“命令...

时间之友
2017/12/04
0
0

没有更多内容

加载失败,请刷新页面

加载更多

3_数组

3_数组

行者终成事
30分钟前
3
0
经典系统设计面试题解析:如何设计TinyURL(二)

原文链接:https://www.educative.io/courses/grokking-the-system-design-interview/m2ygV4E81AR 编者注:本文以一道经典的系统设计面试题:《如何设计TinyURL》的参考答案和解析为例,帮助...

APEMESH
今天
7
0
使用logstash同步MySQL数据到ES

概述   在生成业务常有将MySQL数据同步到ES的需求,如果需要很高的定制化,往往需要开发同步程序用于处理数据。但没有特殊业务需求,官方提供的logstash就很有优势了。   在使用logstas...

zxiaofan666
今天
10
0
X-MSG-IM-分布式信令跟踪能力

经过一周多的鏖战, X-MSG-IM的分布式信令跟踪能力已基本具备, 特点是: 实时. 只有要RX/TX就会实时产生信令跟踪事件, 先入kafka, 再入influxdb待查. 同时提供实时sub/pub接口. 完备. 可以完整...

dev5
今天
7
0
OpenJDK之CyclicBarrier

OpenJDK8,本人看的是openJDK。以前就看过,只是经常忘记,所以记录下 图1 CyclicBarrier是Doug Lea在JDK1.5中引入的,作用就不详细描述了,主要有如下俩个方法使用: await()方法,如果当前线...

克虏伯
今天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部