shell中函数类似于java中的方法,脚本代码放在函数中,可以任意位置运行减少大量重复代码。
了解掌握shell函数主要从以下几点:函数的创建、函数调用、变量、返回值、参数。
1、函数创建以及调用。
基本结构:有两种方式带function和不带function,
function hello ()
{
}
以及
hello ()
{
}
举个例子:
#!/bin/sh
function hello()
{
echo "this is a day : `date`"
}
echo '======='
hello
echo '======='
#执行结果
=======
this is a day : Fri Sep 28 11:56:00 CST 2012
=======
需要注意的是:1、函数的创建一定在调用之前。2、函数名称不要重复,否则先定义的会被覆盖。
2、返回值
首先说下默认退出状态,在脚本中用$?表示。表示:最后一次执行命令的退出状态,0代表成功,非0代表失败。
2.1、$?
#!/bin/sh
function hello()
{
echo "this is a day : `date`"
cd /qwer
}
echo "state:$?"
echo '======='
hello
echo "state: $?"
echo '======='
#执行结果:
state:0
=======
this is a day : Fri Sep 28 12:12:31 CST 2012
./fun.sh: line 5: cd: /qwer: No such file or directory
state: 1
=======
如上所示:两个$?分别0和1,对比来看下一个程序:
#!/bin/sh
function hello()
{
echo "this is a day : `date`"
cd /qwer
}
echo "state:$?"
echo '======='
hello
echo "test..test..."
echo "state: $?"
echo '======='
#执行结果:
state:0
=======
this is a day : Fri Sep 28 12:19:28 CST 2012
./fun.sh: line 5: cd: /qwer: No such file or directory
test..test...
state: 0
=======
现在可以深刻理解$?的含义了,shell命令最后一次的执行状态,当执行完函数后又执行了其他的命令,那么$?就表示其他命令的执行状态了。
关于$?还有一个好玩的:
#!/bin/sh
function hello()
{
cd /qwer
echo "this is a day : `date`"
}
echo "state:$?"
echo '======='
hello
echo "state: $?"
echo '======='
#执行结果:
state:0
=======
./fun.sh: line 4: cd: /qwer: No such file or directory
this is a day : Fri Sep 28 12:26:43 CST 2012
state: 0
=======
好吧,默认退出状态不太好用吧。
2.2、使用返回值return
return只能返回单个的整数,对于字符串脚本会报错。
看下面的程序。用户输入值和100比较,返回不同的值。
read -p "please input :" value
test()
{
if [ $value -lt 100 ]
then
echo "< 100 "
return -1
elif [ $value -eq 100 ]
then
echo "= 100"
return 0
else
echo "> 100"
return 1
fi
}
test
echo "result value is :$?"
#执行结果:
please input :999
> 100
result value is :1
即是return的返回值由$?接受。
====================================
有一点很疑惑,如果在上述脚本if语句的结束后,加上return 1000
最后程序的输出,
please input :999
> 100
result value is :1
为什么是1?有的时候是255,???
====================================
另外在一种方法就是使用函数的输出。输出可以被捕获放入shell变量中。
ceo () {
read -p "please input a value:" value
echo $[ $value * 2 ]
}
result=`ceo`
echo "the result is : $result"
#执行结果:
please input a value:999
the result is : 1998
注意接受的时候是result = `ceo`
====================================
还是上述脚本,把输出替换成:
echo $[ $vale ]
echo $[ $value * 2 ]
输出变成了:the result is : 0
不明白?
====================================
3、参数的传递
shell脚本函数参数的传递可以用标准参数环境变量表示。
如下脚本:根据传入参数个数不同,做不同输出
#!/bin/sh
function param()
{
if [ $# -lt 2 ]
then
echo "param count < 2"
elif [ $# -gt 2 ]
then
echo "param count > 2 "
else
echo "param count =2"
fi
}
param 1 2 3
#执行结果:
param count > 2
需要注意的是,函数不能直接使用脚本的参数,函数为自己的参数使用专用的参数环境变量。
就是说在运行脚本时候,用命令行传入的参数函数是无法直接使用的,必须手动传入才可以。
看下面的例子:
function useMainPram()
{
echo "----"
echo $1
echo $2
echo "----"
}
echo $1
echo $2
useMainPram
#文件命名为param.sh
./param.sh 98 99
执行结果:
98
99
----
----
函数中的打印没有值,调整脚本中函数调用为:useMainPram $1 $2
同样的执行命令,结果正确展示。
4、变量
变量主要是作用域的问题,在脚本内(不是函数内部)定义的变量在任何地方都是可以用的,属于全局变量。
函数内部可以定义局部变量用local修饰,作用域仅仅在函数内部。
b=100
function tt()
{
local b=10
result=$[$b + 5 ]
}
tt
echo $result
echo $b
#执行结果:
15
100
5、库文件
函数可以在脚本内部使用,如果多个脚本要使用同一个函数就要使用到库文件。
首先创建库文件,文件名称ku,注意是没有后缀名称的:
function useMainPram()
{
echo "----"
echo $1
echo $2
echo "----"
}
然后在脚本文件中调用,脚本命名param.sh:
. ./ku
echo $1
echo $2
useMainPram $1 $2
#执行结果 ./param.sh:
98
99
----
98
99
----
需要注意的是:引入库文件的格式
点后面有个空格,然后是执行库文件。
到这里就差不多了,函数的基本操作就这些了。