3、在函数中使用变量
如下讲述shell脚本函数内外变量处理方法.
3.1、向函数传递参数
bash shell将函数作为小型脚本处理,函数可以使用标准参数环境变量来表示命令行传递给函数的参数,先看如下例子: [root@wzp ~]# cat 7.3test
#!/bin/bash
function cio {
if [ $# -eq 0 ] || [ $# -gt 2 ]
then
echo -1
elif [ $# -eq 1 ]
then
echo $[ $1 $1 ]
else
echo $[ $1 * $2 ]
fi
}
echo "##############1##############"
echo -n "adding 10 and 15 :"
value=`cio 10 15`
echo $value
echo "##############2##############"
echo -n "adding just one num of 10:"
value=`cio 10`
echo $value
echo "##############3##############"
echo -n "adding no num:"
value=`cio`
echo $value
echo "##############4##############"
echo -n "adding three num 10 20 30 :"
value=`cio 10 20 30`
echo $value
[root@wzp ~]# ./7.3test
##############1##############
adding 10 and 15 :150
##############2##############
adding just one num of 10:20
##############3##############
adding no num:-1
##############4##############
adding three num 10 20 30 :-1 先通过$#来判断参数个数,然后针对个数的不同执行不同的算术运算.通过把参数数目传递给函数去运算,把运行结果显示出来.
还有点注意的,函数为自己的参数值使用专用的参数环境变量,函数无法从脚本命令行直接访问脚本参数值,也就是说函数不识别运行脚本时后面附带的参数值.如果要调用,在使用函数时手工传递这些数据,我们来看个例子: [root@wzp ~]# cat 7.3test
#!/bin/bash
bad () {
echo $[ $1 $2 ]
}
if [ $# -eq 2 ]
then
value=`bad`
echo "the result is : $value"
else
echo "please input two parameters"
fi
[root@wzp ~]# ./7.3test
please input two parameters
[root@wzp ~]# ./7.3test 1 2
./7.3test: line 3: : syntax error: operand expected (error token is " ")
the result is : 之函数不认识1和2这两个$1、$2,就是函数使用的变量不同于脚本主代码的变量,我们在使用函数的使用手工附加,改成如下: [root@wzp ~]# cat 7.3test
#!/bin/bash
bad () {
echo $[ $1 $2 ]
}
if [ $# -eq 2 ]
then
value=`bad $1 $2`
echo "the result is : $value"
else
echo "please input two parameters"
fi
[root@wzp ~]# ./7.3test
please input two parameters
[root@wzp ~]# ./7.3test 8 16
the result is : 24 哈哈,要的就是这个结果,value=`bad $1 $2`是关键语句!!!
3.2、在函数中处理变量
这里要提及一个作用域的概念,表示说变量的可见区域.函数内定义的变量和普通变量有不同的作用域,脚本外部定义的变量要覆盖函数内定义的变量.函数使用两个类型的变量:
*全局变量
*局部变量
1》全局变量
全局变量是shell脚本内处处有效的变量,默认情况下脚本中定义的变量都是全局变量,而默认定义的变量在函数内部也可以正常访问的.例子: [root@wzp ~]# cat 7.3test
#!/bin/bash
fun () {
value=$[ $value * 2 ]
}
read -p "please input the value:" value
fun
echo "the new value is : $value"
[root@wzp ~]# ./7.3test
please input the value:12
the new value is : 24 对于$value是在函数外部定义的,并且是在外部赋值,当调用给函数fun的时候,该变量在函数中也是有效的,这是全局变量的作用体现.
2》局部变量
对于函数内部使用的变量则是局部变量,而在声明变量的时候只要在前面多一个local关键字即可,先看下例子: [root@wzp ~]# cat 7.3test
#!/bin/bash
function cfo {
local temp=$[ $value 5 ]
result=$[ $temp 2 ]
}
temp=8
value=10
cfo
echo "the result is $result"
if [ $temp -gt $value ]
then
echo "temp is larger"
else
echo "temp is smaller"
fi
[root@wzp ~]# ./7.3test
the result is 17
temp is smaller 对于这样的结果,可以分析如下:返回$result的结果是从函数中得到的,那么势必采用函数内部的temp变量,而函数内部的$temp变量赋予值后为15,则显示result的值为15 2=17.这一点没什么好质疑的!但是当temp和result进行大小比较的时候,就直接采用全局变量的值,而跟函数内部定义的temp无关了,这也是local定义内部函数的作用体现了.
这里我们顺便把变量的值取出来看看: [root@wzp ~]# cat 7.3test
#!/bin/bash
function cfo {
local temp=$[ $value 5 ]
result=$[ $temp 2 ]
}
temp=8
value=10
cfo
echo "the result is $result"
if [ $temp -gt $value ]
then
echo "temp is larger"
echo "temp=$temp ; result=$result"
else
echo "temp is smaller"
echo "temp=$temp ; result=$result"
fi
[root@wzp ~]# ./7.3test
the result is 17
temp is smaller
temp=8 ; result=17 我只是多加了两个echo "temp=$temp ; result=$result",就为了把temp和result这两个变量显示出来,我们看到,执行函数后,temp的值没变,函数中局部定义了temp,还是8;可是value的值通过函数运算后是有效生成的,附加后是17.