直到目前为止,我们做实验所编写的shell程序都是非常短小的。可在实际应用中,有时我们为项目所编写的脚本程序是非常大型的,这时我们该如何来构造自己的代码呢。很多人可能想到说将我们大型脚本按照功能模块拆分成多个小型脚本,但这种做法存在如下几个缺点:
1、在一个脚本程序中运行另外一个脚本程序要比执行一个函数慢得多。
2、返回执行结果变得更加困难,而且可能存在非常多的小脚本。
基于上面原因及拆分思想,我们可以定义并使用shell函数,其语法格式为:
[function]函数名( )
{
命令表(Statements)
}
语法结构分析:
其中,关键字function可以缺省。
通常,函数中的最后一个命令执行之后,就退出被调函数。也可利用return命令立即退出函数,其语法格式是:
return [ n ]
其中,n值是退出函数时的退出值(退出状态),即$?的值。当n值缺省时,则退出值是最后一个命令执
函数应先定义,后使用。调用函数时,直接利用函数名,如foo,不必带圆括号,就像一般命令那样使用。其最大作用就是可以简化很多代码,这在较大的shell脚本设计中可能会更加明显,如本章中的综合应用。
实验1:利用shell函数写一个简单的显示例子
[root@localhost shell]# vi sh.sh
#!/bin/bash
first()
{
echo "***********************************"
}
second()
{
echo "======================="
}
third()
{
echo "* *"
}
four()
{
echo "* hello,welcome to linux world *"
}
five()
{
echo "* (http://www.gec-edu.org) *"
}
second
first
third
third
four
five
third
third
first
second
运行这个脚本程序会显示如下的输出信息:
[root@localhost shell]# ./sh.sh
==========================
*****************************
* *
* *
* hello,welcome to linux world *
* (http://www.gec-edu.org) *
* *
* *
*****************************
==========================
实验解析:
这个脚本程序还是从自己的顶部开始执行,这一点与其他脚本程序没有什么分别。但当它遇见first()结构时,它知道定义了一个名为first的函数。它会记住foo代表一个函数并从}字符之后的位置继续执行。当执行到单独的行foo时,shell就知道应该去执行刚才定义的函数了,当这个函数执行完毕以后,执行过程会返回到调用foo函数的那条语句的后面继续执行。
你必须在调用一个函数之前先对它进行定义,这有点像Pascal语言里函数必须先于调用而被定义的概念,只是在shell中不存在前向声明。
Shell脚本与函数间的参数传递可利用位置参数和变量直接传递。当一个函数被调用时,
变量的值可以直接由Shell脚本传递给被调用的函数,而脚本程序中所用的位置参数$*、$@、$#、$1、$2等则会被替换为函数的参数。当函数执行完毕后,这些参数会恢复为它们之前的值。
实验2:变量作为参数被shell函数调用
[root@localhost shell]# vi sh_01.sh
#!/bin/bash
input_data()
{
echo -e "Enter your data:\c"
read tmp
data=${tmp%%,*}
}
insert_title()
{
echo $* >> title_file
return
}
input_data
insert_title $data
运行这个脚本程序会显示如下的输出信息:
[root@localhost shell]# ls
sh_01.sh
[root@localhost shell]# ./sh_01.sh
Enter your data:yang jing zhao
[root@localhost shell]# ls
sh_01.sh title_file
[root@localhost shell]# cat title_file
yang jing zhao
实验3:脚本的位置参数作为参数被shell函数调用
[root@localhost shell]# vi sh_02.sh
#!/bin/bash
get_sure ()
{
echo "Is your data: $*"
echo -n "Enter yes or no:"
while true
do
read x
case "$x" in
y | yes ) return 0;;
n | no ) return 1;;
*) echo "answer yes or no" ;;
esac
done
}
echo "shell parameters you input are
*"
![](http://www.weicedu.com/static/image/smiley/default/shy.gif)
if get_sure "$*"
then
echo "the data you enter is
*"
![](http://www.weicedu.com/static/image/smiley/default/shy.gif)
else
echo "you enter nothing"
fi
exit 0
运行这个脚本程序会显示如下的输出信息:
[root@localhost shell]# ./sh_02.sh yang jing zhao
shell parameters you input are:yang jing zhao
Is your data: yang jing zhao
Enter yes or no:y
the data you enter is:yang jing zhao
[root@localhost shell]# ./sh_02.sh yang jing zhao
shell parameters you input are:yang jing zhao
Is your data: yang jing zhao
Enter yes or no:n
you enter nothing
本文转载于唯C教育,【Linux基础】shell函数
http://www.weicedu.com/forum.php?mod=viewthread&tid=95&fromuid=4
(出处: http://www.weicedu.com/)