Linux#11 shell脚本函数
Posted 代码荣耀
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux#11 shell脚本函数相关的知识,希望对你有一定的参考价值。
00
shell脚本函数
函数是软件功能复用的基本单元。在实际开发中,我们常会将特定功能设计为函数,一个软件功能常由一个和多个函数的组合调用所实现。一个函数包含如下元素:
函数名
形参列表
语句实现体
返回值
调用函数时,可将函数当做“黑盒”,调用方不需要知道函数是如何实现(how)的,但是需要知道函数是做什么的(what),调用方给函数提供实参列表,并获取函数返回值,参与调用后的业务处理。
01
快速入门
1.1 创建函数
bash shell提供了两种定义shell 函数的风格。
风格1:
function name {
commands
}
风格2:
name() {
commands
}
在上述两种不同定义风格中,name为函数名称;commands由一条或多条bash shell命令构成,在被调用时,按照顺序依次执行。
1.2 调用函数
要在脚本中使用函数,只需要指定函数名即可。示例如下:
一切看起来很简单,但是有如下注意事项:
函数一定要定义在被调用位置的前面,否则shell会报错
函数名一定要唯一;如果新定义的函数名称和已有函数名称重复,那么新定义会覆盖原有函数的定义,且shell不会报错,容易给开发人员造成困扰
02
函数返回值
脚本运行结束后都会返回一个退出状态码,以下将介绍三种函数退出状态码的生成方法。
2.1 默认方法
默认情况下,函数的退出状态码是函数中最后一条命令返回的退出状态码。在函数执行结束后,可用$?变量来获取该值:
当命令执行失败,返回非0值
当命令执行成功,返回0值
2.2 使用return命令
bash shell使用return命令来退出函数并返回特定的退出状态码。
格式:
return n
在上述命令格式中,return为关键字;n为整数值,即退出状态码,必须在0 ~ 255之间,当n作为不在该范围的返回值时,将发生诡异现象。如果要返回一个超越上述范围的退出状态码,请参考第3种方法。
2.3 使用函数输出
正如同可以将命令的输出保存到shell变量中一样,我们也可以将函数的输出保存到shell变量中:
设置返回值格式:echo $result
获取返回值格式:retValue=`funcName`
在“设置返回值格式”中,可采用echo命令设置返回值;该方法除了可以返回数值外,也可返回字符串;在实际应用强烈推荐使用该方法。
在“获取返回值格式”中,retValue为函数的返回值;funcName为函数名称;用两个反引号将funcName包围起来表示执行shell函数。示例如下:
03
在函数中使用变量
3.1 向函数传递参数
格式:func [var1] [var2] ...
在上述格式中,func为shell函数名称,var1、var2为传递给函数的变量(变量数目无限制);另外在调用的时候,需要注意将函数名和参数列表放在同一行。
在函数定义的内部如何取得变量了?shell函数可以使用标准的参数环境变量来代表命令行上传给函数的参数:
$0 : 函数名称(常需用basename命令处理获得)
$1 : 指代第1个参数
$2 : 指代第2个参数
$n:指代第n个参数
$#:参数的数目
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
创建函数库
bash shell允许用户将多个函数写入一个文件,该文件即为函数库文件;该文件由多个shell函数组成,当我们需要调用这些函数时,只需要在脚本中引用该函数库文件即可。
第一步:创建函数库libs
libs为函数库名称;用户可以根据实际情况进行命名。
第二步:导入函数库
函数库文件创建好以后,可以通过两种方法导入函数库;完成导入以后即可直接调用。
source命令 :source命令后带绝对路径或相对路径的库文件
点操作符(.) : . 操作符后带绝对路径或相对路径的库文件
注意:
为了更加方便地调用shell函数,我们可以充分利用.bashrc文件。可通过以下两种途径实现:
在.bashrc文件中定义shell函数
在.bashrc文件中执行source或点操作符导入函数库
以上两种方式将在每次启动新shell时都会加载自定义函数,这样我们可以非常方便的在控制台终端或shell脚本中直接调用这些自定义函数(而不再需要在shell脚本中再次导入函数库文件)
07
小结
综上,本文对函数创建、函数调用、函数返回值、函数变量、递归函数、函数库进行了介绍。在下文中,我们将会进阶到命令行编辑器。敬请期待!
One More Thing
推荐1:
上文1:
上文2:
以上是关于Linux#11 shell脚本函数的主要内容,如果未能解决你的问题,请参考以下文章