当你的bash脚本中有很多代码时,看起来会很混乱,有些代码可能会重复。这时候可以使用函数来避免代码重复。今天我们将介绍如何在bash中创建函数,以及函数中的返回值和传递参数。在bash中创建函数创建bash函数有两种不同的语法。最常用的方法如下:function_name(){commands}第二种方法不太常用,如下:functionfunction_name{commands}使用函数时需要注意以下几点:除非被调用,一个函数永远不会被执行;必须先定义该函数,然后才能调用它。作为演示,我们使用以下代码创建一个fun.sh脚本:#!/bin/bashhello(){echo"HelloWorld"}hellohellohello在上面的脚本中,我们定义了一个名为hello的函数,它将在终端上打印你好世界。后面我们调用了3次hello函数,所以运行脚本后,你会看到屏幕上打印了3次HelloWorld:$./fun.shHelloWorldHelloWorldHelloWorld函数的返回值在很多编程语言中,当函数被调用都有返回值,但是bash函数中没有返回值。当函数执行完成时,$?变量将作为退出状态返回,0表示执行成功,其他非零正整数(1-255)表示执行失败。我们来写一个例子,命名为error.sh,在里面写一个return语句,如下代码所示:#!/bin/basherror(){blablareturn0}errorecho"error函数的返回状态为:$?"执行结果如下:$./error.sh./error.sh:line4:blabla:commandnotfound错误函数的返回状态为:0因为有一行return0,即使函数中有一行blabla报错,error函数仍然返回状态码0表示执行成功。执行完return语句后,函数会立即终止。将参数传递给bash函数我们可以将参数传递给函数,就像将参数传递给bash脚本一样。作为演示,让我们创建一个名为iseven.sh的脚本,如下所示:#!/bin/bashiseven(){if[$(($1%2))-eq0];然后echo"$1是偶数。"elseecho"$1是奇数。"fi}iseven3iseven4iseven20iseven111iseven()函数判断数字是偶数还是奇数。调用的时候把参数放在函数名后面,函数执行的时候会读取$1得到传入的参数。让我们执行它:$./iseven.sh3是奇数。4是偶数。20是偶数。111是奇数。这里需要注意的是,bash函数中的参数和bash脚本中的参数需要区分,见下面的funarg。shscript:#!/bin/bashfun(){echo"$1是fun()的第一个参数"echo"$2是fun()的第二个参数"}echo"$1是脚本的第一个参数。"echo"$2isthesecondargumenttothescript."fun是7执行结果如下:$./funarg.shCoolStuffCool是脚本的第一个参数。Stuff是脚本的第二个参数。Yes是fun()7的第一个参数是fun()的第二个参数。可以看到$1和$2也用来指代脚本参数和函数参数。实际调用的时候,值是不一样的。bash函数中的全局变量和局部变量是大多数编程语言的穷举,bash变量分为全局变量和局部变量。其中,全局变量可以在任何地方访问,而局部变量只能在定义它们的函数中访问。作为演示,请参阅以下scope.sh脚本:#!/bin/bashv1='A'v2='B'myfun(){localv1='C'v2='D'echo"Insidemyfun():v1:$v1,v2:$v2"}echo"调用myfun()之前:v1:$v1,v2:$v2"myfunecho"调用myfun()之后:v1:$v1,v2:$v2"我们首先定义two两个全局变量v1和v2,然后在函数myfun()中,使用local关键字定义一个局部变量v1,并修改全局变量v2。在不同的函数中,局部变量可以使用相同的变量名。执行一下,结果如下:$./scope.shBeforecallingmyfun():v1:A,v2:BInsidemyfun():v1:C,v2:DAftercallingmyfun():v1:A,v2:D,我们可以看到:如果局部变量的变量名与全局变量的变量名相同,那么局部变量的优先级会更高;全局变量的值可以在函数中改变。递归函数递归函数是一个调用自身的函数。阶乘计算是递归函数的经典示例,请参见以下脚本factorial.sh:#!/bin/bashfactorial(){if[$1-le1];然后echo1elselast=$(factorial$(($1-1)))echo$(($1*last))fi}echo-n"4!is:"factorial4echo-n"5!is:"factorial5echo-n"6!is:"factorial6任何递归函数必须以开始以必须能够结束递归函数调用链的基本条件开始。在factorial()函数中,基本条件是:if[$1-le1];然后echo1然后导出阶乘函数的递归情况。要计算n的阶乘,其中n是大于1的正数,请将n乘以n-1的阶乘:factorial(n)=n*factorial(n-1)使用上面的公式为a编写一个算法递归函数:last=$(factorial$(($1-1)))echo$(($1*last))然后运行它并查看结果:$./factorial.sh4!是:245!是:1206!是:720
