第16章 函数

16.1 函数的基本知识

16.1.1 函数的定义和调用

函数是Shell脚本中自定义的一系列执行命令,一般来说函数应该设置有返回值(正确返回0,错误返回非0。对于错误返回,可以定义返回其他非0正值来细化错误,这将在下一节中详细描述)。使用函数最大的好处是可避免出现大量重复代码,同时增强了脚本的可读性:如果你在某个Shell脚本中看到checkFileExist这样的代码(实际上是函数调用),一定不难猜出代码的作用。

在Shell中定义函数的方法如下(其中function为定义函数的关键字,可以省略):


  1. #shell

  2. 中的函数定义

  3. #

  4. 其中function

  5. 为关键字,FUNCTION_NAME

  6. 为函数名

  7. function FUNCTION_NAME(){

  8. command1 #

  9. 函数体中可以有多个语句,不允许有空语句

  10. command2

  11. ...

  12. }

  13. #

  14. 省略关键字function

  15. ,效果一致

  16. FUNCTION_NAME(){

  17. command1

  18. command2

  19. ...

  20. }


下面演示一个简单的函数定义和函数调用相关的例子。你可能会注意到,调用函数的方法时只要调用函数名即可。


  1. [root@localhost ~]# cat sayHello.sh

  2. #!/bin/bash

  3. function sayHello(){ #

  4. 定义函数sayHello

  5. echo "Hello" #

  6. 该函数的函数体为打印Hello

  7. } #

  8. 函数定义结束

  9. echo "Call function sayHello" #

  10. 提示函数调用

  11. sayHello #

  12. 函数调用

  13. #

  14. 脚本执行结果

  15. [root@localhost ~]# bash sayHello.sh

  16. Call function sayHello

  17. Hello #

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


下面的例子稍微复杂一点,在脚本中定义函数countLine,可计算指定文件的行数。


  1. [root@localhost ~]# cat countLine.sh

  2. #!/bin/bash

  3. FILE=etcpasswd #

  4. 指定要检查的文件

  5. function countLine(){ #

  6. 定义函数countLine

  7. local i=0

  8. while read line

  9. do

  10. let ++i

  11. done < $FILE

  12. echo "$FILE have $i lines"

  13. }

  14. echo "Call function countLine" #

  15. 提示函数调用

  16. countLine #

  17. 函数调用

  18. #

  19. 执行结果

  20. [root@localhost ~]# bash countLine.sh

  21. Call function countLine

  22. etcpasswd have 36 lines #

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