Linux#11 shell脚本函数

Posted 代码荣耀

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux#11 shell脚本函数相关的知识,希望对你有一定的参考价值。

点击上方蓝色小字,关注后端技术
碎片时间x体系学习
这是第147原创;距2019年还有155
交流微信:friendfb

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函数。示例如下:


Linux#11 shell脚本函数


03


在函数中使用变量



3.1 向函数传递参数


格式:func [var1] [var2] ...


在上述格式中,func为shell函数名称,var1、var2为传递给函数的变量(变量数目无限制);另外在调用的时候,需要注意将函数名和参数列表放在同一行。


在函数定义的内部如何取得变量了?shell函数可以使用标准的参数环境变量来代表命令行上传给函数的参数:

  • $0 : 函数名称(常需用basename命令处理获得)

  • $1 : 指代第1个参数

  • $2 : 指代第2个参数

  • $n:指代第n个参数

  • $#:参数的数目


3.2 变量的作用域


根据变量的作用域,我们将变量分为两种类型:

  • 全局变量

  • 局部变量


(1)全局变量


默认情况下,在脚本中定义在函数外部的任何变量都是全局变量。全局变量是在shell脚本中任何位置都有效的变量。在函数内定义的变量作用域仅限于本函数内。


Linux#11 shell脚本函数


如上例所示,我们在函数外定义了全局变量result;在函数内部定义了局部变量var。为此,运行脚本后,我们在函数外部无法访问到局部变量var的值。


(2)局部变量


如果我们在函数中修改了全局变量,那么就实现了该变量的永久性修改;根据该特性,我们容易掉入一个坑:我们本不想在函数中修改全局变量,但是不小心了定义了和全局变量名称一致的变量,并对该值进行了修改,那么也就相当于对全局变量进行了修改。


基于此,shell提供了定义局部变量的方法:只要在变量声明的前面加上local关键字即可。local关键字保证了变量只局限在该函数中;如果脚本中该函数之外有同样的名字的变量,那么shell将会保持这两个变量的值是分离的。


Linux#11 shell脚本函数


04


数组变量和函数


4.1 向函数传数组参数


传递格式:${array[*]}

获取格式:(`echo "$@"`)


在上述格式中array为数组名称,以下为典型应用示例:


Linux#11 shell脚本函数


4.2 从函数返回数组


格式:echo ${array[*]}


在上述格式中array为数组名称,以下为典型应用示例:


Linux#11 shell脚本函数


05


函数递归



递归是一种特殊的算法函数。以下通过阶乘运算来说明如何编写一个递归函数。


Linux#11 shell脚本函数


06


创建函数库



bash shell允许用户将多个函数写入一个文件,该文件即为函数库文件;该文件由多个shell函数组成,当我们需要调用这些函数时,只需要在脚本中引用该函数库文件即可。


第一步:创建函数库libs


Linux#11 shell脚本函数


libs为函数库名称;用户可以根据实际情况进行命名。


第二步:导入函数库


函数库文件创建好以后,可以通过两种方法导入函数库;完成导入以后即可直接调用。

  • source命令    :source命令后带绝对路径或相对路径的库文件

  • 点操作符(.) :  . 操作符后带绝对路径或相对路径的库文件


注意:

为了更加方便地调用shell函数,我们可以充分利用.bashrc文件。可通过以下两种途径实现:

  • 在.bashrc文件中定义shell函数

  • 在.bashrc文件中执行source或点操作符导入函数库


以上两种方式将在每次启动新shell时都会加载自定义函数,这样我们可以非常方便的在控制台终端或shell脚本中直接调用这些自定义函数(而不再需要在shell脚本中再次导入函数库文件)


07


小结

  


综上,本文对函数创建、函数调用、函数返回值、函数变量、递归函数、函数库进行了介绍。在下文中,我们将会进阶到命令行编辑器。敬请期待!



One More Thing


推荐1:

上文1:

上文2: 


以上是关于Linux#11 shell脚本函数的主要内容,如果未能解决你的问题,请参考以下文章

Linux之Shell脚本编程

如何写一个shell脚本在Linux下来运行main函数

Linux系统shell脚本之函数的使用

[Linux脚本]Shell脚本编程

[Linux脚本]Shell脚本编程

每天三分钟搞定linux shell脚本26 函数返回值