您的位置:首页 > 其它

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

2016-12-20 17:21 435 查看

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


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: