2009-02-26

shell, awk, perl的函数定义与使用比较

这几种脚本都支持自定义函数,但是它们形式各不相同.包括定义函数用的关键字,以及函数的几大特征:参数的传递方式,返回值等.

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

没有评论:

发表评论