00
函数是软件功能复用的基本单元。在实际开发中,我们常会将特定功能设计为函数,一个软件功能常由一个和多个函数的组合调用所实现。一个函数包含如下元素:
调用函数时,可将函数当作“黑盒”,调用方不须要晓得函数是怎样实现(how)的,而且须要晓得函数是做哪些的(what),调用方给函数提供形参列表,并获取函数返回值,参与调用后的业务处理。
01
快速入门
1.1创建函数
bashshell提供了两种定义shell函数的风格。
风格1:
functionname{
commands
}
风格2:
name(){
commands
}
在上述两种不同定义风格中,name为函数名称;commands由一条或多条bashshell命令构成,在被调用时,依照次序依次执行。
1.2调用函数
要在脚本中使用函数,只须要指定函数名即可。示例如下:
一切看上去很简单,并且有如下注意事项:
02
函数返回值
脚本运行结束后就会返回一个退出状态码,以下将介绍三种函数退出状态码的生成方式。
2.1默认方式
默认情况下,函数的退出状态码是函数中最后一条命令返回的退出状态码。在函数执行结束后,可用$?变量来获取该值:
2.2使用return命令
bashshell使用return命令来退出函数并返回特定的退出状态码。
格式:
returnn
在上述命令格式中,return为关键字;n为整数值,即退出状态码,必须在0~255之间shell脚本 变量,当n作为不在该范围的返回值时,将发生离奇现象。假如要返回一个赶超上述范围的退出状态码,请参考第3种方式。
2.3使用函数输出
正仿佛可以将命令的输出保存到shell变量中一样shell脚本 变量,我们也可以将函数的输出保存到shell变量中:
设置返回值格式:echo$result
获取返回值格式:retValue=`funcName`
在“设置返回值格式”中,可采用echo命令设置返回值;该方式不仅可以返回数值外,也可返回字符串;在实际应用强烈推荐使用该技巧。
在“获取返回值格式”中,retValue为函数的返回值;funcName为函数名称;用两个反顿号将funcName包围上去表示执行shell函数。示例如下:
03
在函数中使用变量
3.1向函数传递参数
格式:func[var1][var2]…
在上述格式中,func为shell函数名称,var1、var2为传递给函数的变量(变量数量无限制);另外在调用的时侯,须要注意将函数名和参数列表置于同一行。
在函数定义的内部怎样取得变量了?shell函数可以使用标准的参数环境变量来代表命令行上传给函数的参数:
3.2变量的作用域
按照变量的作用域,我们将变量分为两种类型:
(1)全局变量
默认情况下,在脚本中定义在函数外部的任何变量都是全局变量。全局变量是在shell脚本中任何位置都有效的变量。在函数内定义的变量作用域仅限于本函数内。
如上例所示,我们在函数外定义了全局变量result;在函数内部定义了局部变量var。因此,运行脚本后,我们在函数外部难以访问到局部变量var的值。
(2)局部变量
假如我们在函数中更改了全局变量,这么就实现了该变量的永久性更改;依据该特点,我们容易掉进一个坑:我们本不想在函数中更改全局变量,并且不留神了定义了和全局变量名称一致的变量,并对该值进行了更改,这么也就相当于对全局变量进行了更改。
基于此,shell提供了定义局部变量的方式:只要在变量申明的后面加上local关键字即可。local关键字保证了变量只局限在该函数中;假如脚本中该函数之外有同样的名子的变量,这么shell将会保持这两个变量的值是分离的。
04
链表变量和函数
4.1向函数传链表参数
传递格式:${array[*]}
获取格式:(`echo”$@”`)
在上述格式中array为链表名称,以下为典型应用示例:
4.2从函数返回链表
格式:echo${array[*]}
在上述格式中array为链表名称,以下为典型应用示例:
05
函数递归
递归是一种特殊的算法函数。以下通过阶乘运算来说明怎样编撰一个递归函数。
06
创建函数库
bashshell容许用户将多个函数写入一个文件,该文件即为函数库文件;该文件由多个shell函数组成,当我们须要调用那些函数时,只须要在脚本中引用该函数库文件即可。
第一步:创建函数库libs
libs为函数库名称;用户可以依据实际情况进行命名。
第二步:导出函数库
函数库文件创建好之后,可以通过两种方式导出函数库;完成导出之后即可直接调用。
注意:
为了愈加便捷地调用shell函数,我们可以充分借助.bashrc文件。可通过以下两种途径实现:
以上两种方法将在每次启动新shell时就会加载自定义函数,这样我们可以十分便捷的在控制台终端或shell脚本中直接调用那些自定义函数(而不再须要在shell脚本中再度导出函数库文件)
07
小结
综上,本文对函数创建、函数调用、函数返回值、函数变量、递归函数、函数库进行了介绍。在下文中,我们将会进阶到命令行编辑器。敬请期盼!
OneMoreThing
推荐1:
上文1:
上文2:
近日,我和活跃在业界的一线技术老司机们共同开通了知识星球,——一个与公众号有别,但又一脉相承的技术圈、认知圈:公众号会一如既往地进行知识分享,知识星球则坚持关注解决问题与动手实践,主要涉及Java前端、Linux、Python、Android等技术领域,问题很广、方法好多、思绪很快,希望我们能否在这儿伫足思索、交流、沉淀、提升。
你负责认真,我们负责帮你解决问题,让改变发生;欢迎你们扫码加入我们的星球。期盼2018,在程序猿成长的公路上,共同进化!
暂无评论内容