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函数,用于判断文件是否存在。


  1. [root@localhost ~]# cat checkFileExist.sh #!/bin/bash

  2. FILE=etcnotExistFile #

  3. 定义一个不存在的文件

  4. function checkFileExist(){ #

  5. 定义checkFileExist 函数

  6. if [ -f $FILE ]; then return 0

  7. else

  8. return 1

  9. fi

  10. }

  11. echo "Call function checkFileExist" #

  12. 提示函数调用

  13. checkFileExist #

  14. 调用函数

  15. if [ $? -eq 0 ]; then echo "$FILE exist"

  16. else

  17. echo "$FILE not exist"

  18. Fi

  19. #

  20. 执行结果

  21. [root@localhost ~]# bash checkFileExist.sh Call function checkFileExist etcnotExistFile not exist #

  22. 这里是调用函数的输出内容


下面举一个利用多个函数返回值判断用户输入的例子,如果用户输入的数值大于等于0且小于10则返回0,大于等于10且小于20则返回1,大于等于20且小于30则返回2,输入其余数值则返回3。


  1. [root@localhost ~]# cat checkNum.sh #!/bin/bash

  2. function checkNum(){ #

  3. 定义函数checkNum

  4. echo -n "Please input a number:"

  5. read NUM

  6. if [ $NUM -ge 0 -a $NUM -lt 10 ]; then return 0 #

  7. 如果输入值属于[0,10)

  8. 则返回0

  9. fi

  10. if [ $NUM -ge 10 -a $NUM -lt 20 ]; then return 1 #

  11. 如果输入值属于[10,20) 则返回1

  12. fi

  13. if [ $NUM -ge 20 -a $NUM -lt 30 ]; then return 2 #

  14. 如果输入值属于[20,30) 则返回2

  15. fi

  16. return 3 #

  17. 其余输入全部返回3

  18. }

  19. echo "Call function checkNum" #

  20. 提示函数调用

  21. checkNum #

  22. 函数调用

  23. RTV=$? #

  24. 将函数返回值保存到变量RTV

  25. #

  26. 根据RTV

  27. 判断输入数据的范围

  28. if [ $RTV -eq 0 ]; then echo "The number is between [0,10)"

  29. elif [ $RTV -eq 1 ]; then echo "The number is between [10,20)"

  30. elif [ $RTV -eq 2 ]; then echo "The number is between [20,30)"

  31. else

  32. echo "Unknown input"

  33. fi

  34. #

  35. 脚本运行结果

  36. [root@localhost ~]# bash checkNum.sh Call function checkNum Please input a number:5

  37. The number is between [0,10) [root@localhost ~]# bash checkNum.sh Call function checkNum Please input a number:15

  38. The number is between [10,20) [root@localhost ~]# bash checkNum.sh Call function checkNum Please input a number:25

  39. The number is between [20,30) [root@localhost ~]# bash checkNum.sh Call function checkNum Please input a number:35

  40. Unknown input