Shell函数(函数定义、函数调用)

  • 函数
  • 函数调用
  • 函数例题
  • 特殊的函数调用


函数

Shell 函数的本质是一段可以重复使用的脚本代码,这段代码被提前编写好了,放在了指定的位置,使用时直接调取即可。

语法结构:

function 函数名 ()
		{
			命令列表
			return	value
		}

function是 Shell 中的关键字,专门用来定义函数,也可以不写。
return value表示函数的返回值。
由{ }包围的部分称为函数体,调用一个函数,实际上就是执行函数体中的代码。

函数调用

调用 Shell 函数时可以给它传递参数,也可以不传递。如果不传递参数,直接给出函数名字即可:

函数名

如果传递参数,那么多个参数之间以空格分隔:

函数名 param1 param2 param3

不管是哪种形式,函数名字后面都不需要带括号。

和其它编程语言不同的是,Shell 函数在定义时不能指明参数,但是在调用时却可以传递参数,并且给它传递什么参数它就接收什么参数。

Shell 也不限制定义和调用的顺序,你可以将定义放在调用的前面,也可以反过来,将定义放在调用的后面。

函数例题

示例1、测试一个输入名是否为目录

#!/bin/bash
##测试文件是否为目录##

function testfile()  #函数定义
{
if [ -d $1 ]
then
        echo  "$1 is a directory!"
else
        echo  "$1 is not directory!"
fi
return
}

testfile $1    #函数调用

运行结果:

[root@desktop ~]# ./test04.sh haha
haha is not directory!
[root@desktop ~]# ./test04.sh /etc
/etc is a directory!

示例2、使用函数判断一个数是否为素数

#!/bin/bash
## 使用函数判断一个数是否是素数##

prime()
{
        j=2
        flag=1
		if [ $1 -le 1 ];then
			echo 不能输入小于1的整数.
			#浮点数的情况还没检测#
			exit 1
		fi
		
        while [ $j -le `expr $1 / 2` ]
        do
                if [ `expr $1 % $j` -eq 0 ]
                then flag=0
                        break
                fi
                j=`expr $j + 1`
        done
        if [ $flag -eq 1 ]
        then
                return 1
        else
                return 0
        fi
}

prime $1

if [ $? -eq 1 ]
then
        echo "$1 is a prime!"
else
        echo "$1 is not a prime!"
fi

运行结果:

[root@desktop ~]# ./test5.sh 2
2 is a prime!
[root@desktop ~]# ./test5.sh 3
3 is a prime!
[root@desktop ~]# ./test5.sh 4
4 is not a prime!

示例3、判断两个数的大小关系

#!/bin/bash
##判断两个数的大小关系##

compare()
{
        if [ "$1" -eq "$2" ]
        then
                return 0
        elif
                [ "$1" -gt "$2" ]
        then
                return 1
        else
                return 2
        fi
}

compare $1 $2
case $? in
        0)
                echo "$1 = $2"
        ;;
        1)
                echo "$1 > $2"
        ;;
        2)
                echo "$1 < $2"
        ;;
esac

运行结果:

[root@desktop ~]# ./test06.sh 1 2
1 < 2
[root@desktop ~]# ./test06.sh 2 1
2 > 1
[root@desktop ~]# ./test06.sh 2 2
2 = 2

特殊的函数调用

特殊函数符号

.()
{
.|. &
}
;
.

第 1 行说明下面要定义一个函数,函数名为小数点,没有可选参数。
第 2 行表示函数体开始。
第 3 行是函数体真正要做的事情,首先它递归调用本函数,然后利用管道调用一个新进程(它要做的事情也是递归调用本函数),并将其放到后台执行。
第 4 行表示函数体结束。
第 5 行并不会执行什么操作,在命令行中用来分隔两个命令用。从总体来看,它表明这段程序包含两个部分,首先定义了一个函数,然后调用这个函数。
第 6 行表示调用本函数。