linux shell 自定义函数方法(定义、返回值、变量作用域)
一、定义shell函数(definefunction)
语法:
[function]funname[()]
{
action;
[returnint;]
}
说明:
1、可以带functionfun()定义,也可以直接fun()定义,不带任何参数。
2、参数返回,可以显示加:return返回,如果不加,将以最后一条命令运行结果,作为返回值。return后跟数值n(0-255
实例(testfun1.sh):
#!/bin/sh fSum32; functionfSum() { echo$1,$2; return$(($1+$2)); } fSum57; total=$(fSum32); echo$total,$?; shtestfun1.sh testfun1.sh:line3:fSum:commandnotfound 5,7 3,2
从上面这个例子我们可以得到几点结论:
1、必须在调用函数地方之前,声明函数,shell脚本是逐行运行。不会像其它语言一样先预编译。一次必须在使用函数前先声明函数。
2、total=$(fSum32);通过这种调用方法,我们清楚知道,在shell中单括号里面,可以是:命令语句。因此,我们可以将shell中函数,看作是定义一个新的命令,它是命令,因此各个输入参数直接用空格分隔。一次,命令里面获得参数方法可以通过:$0…$n得到。$0代表函数本身。
3、函数返回值,只能通过$?系统变量获得,直接通过=,获得是空值。其实,我们按照上面一条理解,知道函数是一个命令,在shell获得命令返回值,都需要通过$?获得。
二、函数作用域,变量作用范围
先我们看一个实例(testfun2.sh):
#!/bin/sh echo$(uname); declarenum=1000; uname() { echo"test!"; ((num++)); return100; } testvar() { localnum=10; ((num++)); echo$num; } uname; echo$? echo$num; testvar; echo$num; shtestfun2.sh Linux test! 100 1001 11 1001
我们一起来分析下上面这个实例,可以得到如下结论:
1、定义函数可以与系统命令相同,说明shell搜索命令时候,首先会在当前的shell文件定义好的地方查找,找到直接执行。
2、需要获得函数值:通过$?获得
3、如果需要传出其它类型函数值,可以在函数调用之前,定义变量(这个就是全局变量)。在函数内部就可以直接修改,然后在执行函数就可以读出修改过的值。
4、如果需要定义自己变量,可以在函数中定义:local变量=值,这时变量就是内部变量,它的修改,不会影响函数外部相同变量的值。
这些,是我在工作中,对linux,shell函数使用一些经验总结,有没有提到地方,欢迎交流!
以下是其它网友的补充:
本教程目前为止所有脚本都是从头到尾执行。这样做很好,但你也许已经注意到有些脚本段间互相重复。
shell允许将一组命令集或语句形成一个可用块,这些块称为shell函数。
shell中函数的定义格式如下:
函数名(){
command1
command2
...
commandN
[returnvalue]
}
如果愿意,可在函数名前加上关键字function,这取决于使用者。
function函数名(){
command1
command2
...
commandN
[returnvalue]
}
函数返回值,可以显示增加return语句;如果不加,则将最后一条命令运行结果作为返回值(一般为0,如果执行失败则返回错误代码)。return后跟数值(0-255)。
函数可以放在同一个文件中作为一段代码,也可以放在只包含函数的单独文件中。函数不必包含很多语句或命令,甚至可以只包含一个echo语句,这取决于使用者。
下面的例子定义了一个函数并进行调用:
#!/bin/bash demoFun(){ echo"Thisisyourfirstshellfunction!" } echo"Functionbegin..." hello echo"Functionend!"输出: Functionbegin... Thisisyourfirstshellfunction! Functionend!
下面定义一个带有return语句的函数:
#!/bin/bash funWithReturn(){ echo"Thefunctionistogetthesumoftwonumbers..." echo-n"Inputfirstnumber:" readaNum echo-n"Inputanothernumber:" readanotherNum echo"Thetwonumbersare$aNumand$anotherNum!" return$(($aNum+$anotherNum)) } funWithReturn echo"Thesumoftwonumbersis$?!"输出类似下面: Thefunctionistogetthesumoftwonumbers... Inputfirstnumber:25 Inputanothernumber:50 Thetwonumbersare25and50! Thesumoftwonumbersis75!
函数返回值在调用该函数后通过$?来获得。
注意:所有函数在使用前必须定义。这意味着必须将函数放在脚本开始部分,直至shell解释器首次发现它时,才可以使用。调用函数仅使用其函数名即可。