16.1.2 函数的返回值
函数的返回值又叫函数的退出状态,实际上是一种通信方式。举个生活中的例子便于大家更清楚地了解函数返回值的概念。
假设小王和同学小徐说好每周六早上10点都会到她家里玩,可是小王经常会迟到,这时候小徐都会发消息给小王问她出发了没有?小王收到消息后会根据实际情况回复消息,如果没出发就发送“NO”,否则发送“YES”。在这个例子中,小徐发消息问小王出发了没有,可以看作是一种“调用”,而小王的回复可以看作是调用的“返回值”。如果使用0代表“NO”、1代表“YES”,那么就更像真实的函数调用了。但是只有0和1这两种回复还是略显简单了些——如果是出发了,那么出发到哪里了?我们可以使用2代表走到1/4的路程、使用3代表走到1/2的路程、4代表走到3/4的路程、5代表已经到楼下等,这样返回的值就更有意义了。
Shell中的函数可以使用“返回值”的方式来给调用者反馈信息(使用return关键字),不要忘了获取上一个命令返回值的方式是使用$?(关于$?的用法参见13.1.6节)——这是获取函数返回值的主要方式。下面的例子中将创建checkFileExist函数,用于判断文件是否存在。
- [root@localhost ~]# cat checkFileExist.sh #!/bin/bash
FILE=etcnotExistFile #
定义一个不存在的文件
function checkFileExist(){ #
定义checkFileExist 函数
if [ -f $FILE ]; then return 0
else
return 1
fi
}
echo "Call function checkFileExist" #
提示函数调用
checkFileExist #
调用函数
if [ $? -eq 0 ]; then echo "$FILE exist"
else
echo "$FILE not exist"
Fi
#
执行结果
[root@localhost ~]# bash checkFileExist.sh Call function checkFileExist etcnotExistFile not exist #
这里是调用函数的输出内容
下面举一个利用多个函数返回值判断用户输入的例子,如果用户输入的数值大于等于0且小于10则返回0,大于等于10且小于20则返回1,大于等于20且小于30则返回2,输入其余数值则返回3。
- [root@localhost ~]# cat checkNum.sh #!/bin/bash
function checkNum(){ #
定义函数checkNum
echo -n "Please input a number:"
read NUM
if [ $NUM -ge 0 -a $NUM -lt 10 ]; then return 0 #
如果输入值属于[0,10)
则返回0
fi
if [ $NUM -ge 10 -a $NUM -lt 20 ]; then return 1 #
如果输入值属于[10,20) 则返回1
fi
if [ $NUM -ge 20 -a $NUM -lt 30 ]; then return 2 #
如果输入值属于[20,30) 则返回2
fi
return 3 #
其余输入全部返回3
}
echo "Call function checkNum" #
提示函数调用
checkNum #
函数调用
RTV=$? #
将函数返回值保存到变量RTV
中
#
根据RTV
判断输入数据的范围
if [ $RTV -eq 0 ]; then echo "The number is between [0,10)"
elif [ $RTV -eq 1 ]; then echo "The number is between [10,20)"
elif [ $RTV -eq 2 ]; then echo "The number is between [20,30)"
else
echo "Unknown input"
fi
#
脚本运行结果
[root@localhost ~]# bash checkNum.sh Call function checkNum Please input a number:5
The number is between [0,10) [root@localhost ~]# bash checkNum.sh Call function checkNum Please input a number:15
The number is between [10,20) [root@localhost ~]# bash checkNum.sh Call function checkNum Please input a number:25
The number is between [20,30) [root@localhost ~]# bash checkNum.sh Call function checkNum Please input a number:35
Unknown input