[关闭]
@cdmonkey 2015-12-08T09:45:31.000000Z 字数 1434 阅读 1013

定义Shell函数

shell


函数的作用:简单地说就是把程序里多次调用的相同的代码部分定义为一个代码块,然后给个名称,所有的调用都只使用这个名字就可以了。为了方便程序的管理和模块化并减少代码的重复,函数的确是一个好东西。而Shell中函数的定义有两种方法:

  1. function func_name(){
  2. ...
  3. }
  4. #或者是
  5. func_name(){
  6. ...
  7. }
  8. #注意:()内是没有参数的,它并不像C语言那样,在()里可以有参数。
  1. #调用函数时直接输入函数名(不能带小括号)即可。
  2. func_name

但是函数调用或多或少总是会需要一些参数,那么这些参数要怎么传递进来呢?Shell中参数传递方式为:

  1. func_name #直接输入函数名称,即不需要传递参数。
  2. func_name agr1 arg2 #需要传递两个参数。

函数可以放在同一个文件中作为一段代码,也可以放在只包含函数的单独文件中。

程序实例:

  1. #!/bin/bash
  2. #Filename:LoopPrint.sh
  3. function LoopPrint(){
  4. count=0;
  5. while [ $count -lt $1 ];
  6. do
  7. echo $count;
  8. let ++count;
  9. sleep 1;
  10. done
  11. return 0;
  12. }
  13. read -p "Please input the times of print you want: " n
  14. LoopPrint $n
  15. #程序的功能就是输入一个数字n,然后从0开始每隔1秒输入一个数字,直到输出n-1为止。
  16. #首先,程序会要求你输入一个数学,然后调用函数来进行输出的功能。
  17. #执行结果如下所示:
  18. [root@WEB-A1 scripts]# sh LoopPrint.sh
  19. Please input the times of print you want: 3
  20. 0
  21. 1
  22. 2

上例中函数中的$1就表示第一个参数,而执行脚本时所读入的$n,对于函数来说就是$1

特别注意:定义函数的时候不要使用美元符号($),而使用变量时则一定要使用。
  1. #因此在传递参数时,一定要写成:
  2. LoopPrint $n
  3. #而不能写成:
  4. LoopPrint n
  5. #为什么?例如你输入的是20,则n的值($n)为20,前者表示的是把n的值,即20传递给函数LoopPrint.sh,而后者则表示把n这个字符传递给函数。在Shell中变量的使用并不需要先定义,所以要使用变量,让Shell知道它是一个变量,并要传递它的值,所以就要用$n,而不能直接用n,否则只把n当作一个字符来处理,而不是一个变量。

作用域的问题
上面实例中的while语句也可以写成下面的形式:

  1. while [ $count -lt $n ]; #如果换做这样的写法,至少在本例中是可行的,没有什么问题。

为什么可行?那是因为函数可以使用脚本文件中出现的任何变量。但是!还是建议使用上面例子中的方法,并且不要随意使用函数中的变量之外的变量,因为你并不一定知道你调用函数时函数外有什么变量存,在也不知道它的值是什么,更不能保证别人在使用你的函数时会传递你在函数中使用到的变量名,如这里的n,别人在使用时可能传递的就是他自己定义的变量。

定义Shell函数(Define Function)时需要注意的问题:

  • 函数的定义一定要出现在函数的调用语句之前,因为Shell脚本是逐行运行,不会像其它语言一样先预编译,因此必须在使用函数前先定义函数。
  • 函数返回值,只能通过$?系统变量获得,直接通过=,获得是空值。其实,我们按照上面一条理解,知道函数是一个命令,在shell获得命令返回值,都需要通过$?获得。

程序实例:

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注