shell
定义:shell 使用关键字function来定义函数,
function function_name { command... } 或者 function_name () { command... } |
有三点要注意,一是如果函数名后带了括号,则关键字function可省;二是'{'左边要带空格,或者写在另一行,不然shell会把它们也作为函数名的一部分;三是调用函数时,参数是按位置传送的,即可通过$1,$2等引用.所以函数的参数名称不在定义函数的时候指定,并且在定义函数时括号可以省略(前提是使用function这个关键字).
另外,shell允许嵌套定义函数
调用:定义好函数后,就可以像调用普通的命令一样,通过函数名来调用(不用带括号)
返回值:可以使用return来返回一个整数.这个整数保存在$?中.如果没有使用return,则函数的返回值是函数最后一条语句的退出状态(仍然是保存在$?中)
$ function hello { echo "hello, function"; } $ hello hello, function $ hello() { echo "function withour 'function'"; } $ hello function without 'function' $ function hello{ echo "add some blanks before '{' please.";} bash: syntax error near unexpected token `echo' $ function hello { echo "add some blanks before '{' please.";} $ hello add some blanks before '{' please. $ hello() { echo "you want me to say $1 and $2"; } $ hello for note you want me to say for and note $ hello() { > hello_in_hello() { echo "hello_in_hello" ; } > hello_in_hello > } $ hello_in_hello bash: hello_in_hello: command not found $ hello hello_in_hello $ hello() { ls oops ; } $ hello ls: cannot access oops: No such file or directory $ echo $? 2 $ hello() { return 100 ; } $ hello $ echo $? 100 |
awk
awk也使用function关键字来定义函数,不过在语法上它和shell有很大不同.第一,它的function关键字不能省;第二,它不像shell那样注重空格;第三,它的参数是写在括号里的,不是按位置传递的,所以定义函数时必须有括号,调用函数时也必须有括号;第四,它不能嵌套定义函数;第五,它的返回值也是通过return返回,不过不是通过$?返回,而且它也可能返回整数以外的类型,例如字符串等;
$ cat awk.test function hello(first, second) { print first, second; return "i'm return"; } { retval = hello("for", "note"); print retval; } $ awk -f awk.test - hello for note i'm return |
perl
perl不使用function关键字,它使用sub关键字,因为它把"函数"叫做"subroutines".
定义函数时不需要在函数名后加括号,因为它的参数也是按位置传递的.perl的定义函数的格式和shell的是非常相似的,但是它们不尽相同:
1.对shell来说,'function'和括号可只选其一,而对perl,'sub'总是必须的,而括号总是不需要的;
2.shell通过$1,$2来传递参数,$0表示的是函数名;perl通过@_来传递参数,
$_[0]代表第一个参数,$_[1]代表第二个参数;
3.shell的函数只可返回整数;perl的函数和awk一样,可返回多种类型.
在调用方面,如果函数在定义之后调用,又或者调用的时候带了括号,则可像shell那样直接使用函数名调用;但是如果函数名和系统函数同名,则必须在调用的时候在函数名前加一个&;shell的话,如果函数名和系统命令同名,则自定义的函数会覆盖掉系统的命令.
它们唯一完全一样的一样是,如果没有使用return返回,则最后一条执行的语句的返回值会作为函数的返回值.
$ cat perl.test sub hello { print $_[0]; print $_[1]; return "done\n"; } &hello("for"," note\n"); hello("for note" , "again\n"); print hello("i'm"," return\n"); $ perl -f perl.test for note for noteagain i'm return done |
总结:shell和perl的格式很相似;awk和C语言很相似. shell和perl可很方便地实现变长参数的函数,而awk则不行.
转载请注明出处 http://fornote.blogspot.com
没有评论:
发表评论