[本文是自己学习所做笔记,欢迎转载,但请注明出处:http://blog.csdn.net/jesson20121020]
今天来看一下Shell的函数。
Shell函数
函数定义
shell允许将一组命令集或语句形成一个可用块,这些块称为Shell函数。
函数定义格式:
函数名(){ 命令1 …… } 或 function 函数名(){ …… }
函数可以放在同一个文件中作为一段代码,也可以放在只包含函数的单独文件中。
如下面的脚本就是一个只包含函数的单独文件。
#!/bin/bash #fun_test function hello(){ echo "Hello,today is `date`" return 1 }
既然定义的函数,那么如何调用该函数呢,下面,我们接着看函数调用。
函数调用
以上面定义的函数为例,调用方式如下:
#!/bin/bash #fun_test function hello(){ echo "Hello,today is `date`" return 1 } echo "now going the function hello" hello echo "back from the function"
可以看出,其实和其他语言一样,在主程序中直接用函数名,就可以调用定义好的函数了,我们看下,该脚本的执行结果:
[email protected]:~/develop/worksapce/shell_workspace$ chmod a+rx fun_test.sh [email protected]:~/develop/worksapce/shell_workspace$ ./fun_test.sh now going the function hello Hello,today is 2015年 02月 01日 星期日 20:22:36 CST back from the function
参数传递
向函数传递参数就像是在脚本中使用位置变量一样,$1,...,$9
我们修改上面的例子:
#!/bin/bash #fun_test function hello(){ echo "Hello,$1 today is `date`" return 1 } echo "now going the function hello" hello jesson echo "back from the function"
这里,是以位置变量使用参数,执行如下:
[email protected]:~/develop/worksapce/shell_workspace$ ./fun_test.sh now going the function hello Hello,jesson today is 2015年 02月 01日 星期日 20:28:38 CST back from the function
函数文件
在上面函数定义里也提到了,函数可以单独作为一个文件,那这个文件即称为函数文件,那么就有一个问题了,上面的例子,都是在同一个文件内,也就是函数与函数的调用都在同一个主程序中,那么对于函数文件,该如何调用呢。
还是一样,我们以例子来说明,先定义一个函数文件,修改上个脚本为函数文件,如下
fun_test.sh
#!/bin/bash #fun_test function hello(){ echo "Hello,$1 today is `date`" return 1 }
这里,我们定义了函数文件,我们现在要在另一个脚本里调用该函数文件,该如何做呢????
funfilecall.sh
#!/bin/bash #funfilecall #Source function . fun_test.sh echo "now going to the function hello" hello jesson echo "back from the function"
可以看出,对于函数文件的调用,只需要两步就可实现,第一步就是在调用函数前,先申明函数文件,方法( . 函数文件名),这里要注意,.与函数文件名之间要有空格。接下下,就可以直接调用函数文件里定义的函数了,与之前在同一个文件中调用函数一样。该脚本执行结果如下:
[email protected]:~/develop/worksapce/shell_workspace$ ./funfilecall.sh now going to the function hello Hello,jesson today is 2015年 02月 01日 星期日 20:37:55 CST back from the function
检查载入函数和删除函数
查看载入函数:
set
删除函数
unset
我们修改上面的脚本如下:
#!/bin/bash #funfilecall #Source function . fun_test.sh set unset hello echo "now going to the function hello" hello jesson echo "back from the function"
执行结果如下:
...... now going to the function hello ./funfilecall.sh: 行 8: hello: 未找到命令 back from the function
可以,在脚本中有unset hello,这句的意思是将hello删除,也就是不载入,所以执行结果中才会提示,hello:未找到命令。
另外,$?可以取得一个命令的返回值,一般情况,当命令执行成功时,返回0,执行不成功时返回非0整数。对于函数也类似,可以通过$?取得函数的返回值。