linux 脚本 字符串函数调用函数调用,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函数。示例如下:

46c3d49e67f9d8da40b921a75206a1c0.png

03

在函数中使用变量

3.1 向函数传递参数

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

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

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

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

$1 : 指代第1个参数

$2 : 指代第2个参数

$n:指代第n个参数

$#:参数的数目

3.2 变量的作用域

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

全局变量

局部变量

(1)全局变量

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

3f1307041ee524cb30ea5078287ca963.png

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

(2)局部变量

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

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

3b16abddda4a6485757606430596ba8f.png

04

数组变量和函数

4.1 向函数传数组参数

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

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

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

33b9f2ab2e18d9d76ffefe9d71bf93aa.png

4.2 从函数返回数组

格式:echo ${array[*]}

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

092917fa16372c7bb75e6f64ae21ac1f.png

05

函数递归

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

f863f68c051d77e37fc9eda2df90c219.png

06

创建函数库

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

第一步:创建函数库libs

12654f7518512a179ef178b796cee524.png

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

第二步:导入函数库

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

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

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

注意:

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

在.bashrc文件中定义shell函数

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

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

07

小结

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

One More Thing

推荐1:

上文1:

上文2:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值