Bash 初学者系列 9:在 bash 中使用函数
当你的 bash 脚本中代码非常多的时候,会看起来很混乱,其中有部分代码有可能是重复的。这个时候,可以使用函数来避免重复的代码。
今天我们将介绍在 bash 中如何创建函数,以及函数中的返回值、传递参数等内容。
在 bash 中创建函数
创建 bash 函数有两种不同的语法。最常用的方法如下:
第二种方法不太常用,如下所示:
在使用函数时,需要注意以下几点:
- 除非被调用,否则函数永远不会被执行;
- 函数必须先定义,然后才能被调用。
作为演示,我们创建一个 fun.sh 脚本,如下代码:
上述脚本中,我们定义了一个名为 hello 的函数,它将在终端上打印 Hello World。后面我们调用了三次 hello 函数,因此,运行脚本后,你会在屏幕上看到 Hello World 打印了三次:
函数的返回值
在很多编程语言中,函数在调用时都会返回一个值,然而,在 bash 函数中没有返回值。
当函数执行完成时,会返回一个 $? 变量作为退出状态,0 表示成功执行,其他非零正整数(1 - 255)表示执行失败。
我们来写一个例子,命名为 error.sh,在其中写一个 return 语句,如下代码所示:
执行结果如下:
因为有 return 0 这一行,所以即使函数中有 blabla 这一行的报错,error 函数还是返回了一个执行成功的状态码 0。
return 语句执行后,函数会被立即终止。
向 bash 函数传递参数
我们可以向函数传递参数,就像向 bash 脚本传递参数一样。
作为演示,我们创建一个名为 iseven.sh 的脚本,如下所示:
iseven() 函数判断数字是偶数还是奇数。在调用的时候,将参数放在函数名后面,函数执行的时候会读取 $1 来获取传递的参数。我们来执行一下:
这里需要注意,bash 函数中的参数,和 bash 脚本的参数需要区分开来,看如下 funarg.sh 脚本:
执行结果如下:
可以看到,同样是使用 $1 和 $2 来引用脚本参数和函数参数,当实际调用时,取值是不同的。
bash 函数中的全局变量和局部变量
与大多数编程语言累死,bash 变量具有全局变量和局部变量之分。其中全局变量可以在任何位置方位到,而局部变量只能在其定义的函数中访问。
作为演示,看如下 scope.sh 脚本:
我们首先定义了两个全局变量 v1 和 v2,然后在 函数 myfun() 中,使用 local 关键字 定义了一个局部变量 v1,并修改了全局变量 v2。在不同的函数中,局部变量可以使用相同的变量名。
执行一下,结果如下:
由此,我们可以看到:
- 如果局部变量的变量名与全局变量的变量名相同,那么局部变量优先级会更高;
- 在函数中可以更改全局变量的值。
递归函数
递归函数是一个调用自身的函数。阶乘计算是递归函数的经典例子,看下面的脚本 factorial.sh:
任何递归函数都要从一个基本条件开始,这个基本条件必须可以结束递归函数调用链。在 factorial() 函数中,基本条件为:
然后导出阶乘函数的递归情况。要计算 n 的阶乘,其中 n 是大于 1 的正数,可以将 n 乘以 n-1 的阶乘:
使用上面那个公式来编写递归函数的算法:
然后运行一下,检查运行结果:
相关文章
- Jgit的使用笔记
- 利用Github Action实现Tornadofx/JavaFx打包
- 叹息!GitHub Trending 即将成为历史!
- 微软软了?开源社区讨论炸锅,GitHub CEO 亲自来答
- GitHub Trending 列表频现重复项,前后端都没去重?
- Photoshop Elements 2021版本软件安装教程(mac+windows全版本都有)
- (ps全版本)Photoshop 2020的安装与破解教程(mac+windows全版本都有)
- (ps全版本)Photoshop cc2018的安装与破解教程(mac+windows全版本,包括2023
- 环境搭建:Oracle GoldenGate 大数据迁移到 Redshift/Flat file/Flume/Kafka测试流程
- 每个开发人员都要掌握的:最小 Linux 基础课
- 来撸羊毛了!Windows 环境下 Hexo 博客搭建,并部署到 GitHub Pages
- 超实用!手把手入门 MongoDB:这些坑点请一定远离
- 【GitHub日报】22-10-09 zustand、neovim、webtorrent、express 等4款App今日上新
- 【GitHub日报】22-10-10 brew、minio、vite、seaweedfs、dbeaver 等8款App今日上新
- 【GitHub日报】22-10-11 cobra、grafana、vue、ToolJet、redwood 等13款App今日上新
- Photoshop 2018 下载及安装教程(mac+windows全版本都有,包括最新的2023)
- Photoshop 2017 下载及安装教程(mac+windows全版本都有,包括最新的2023)
- Photoshop 2020 下载及安装教程(mac+windows全版本都有,包括最新的2023)
- Photoshop 2023 资源免费下载(mac+windows全版本都有,包括最新的2023)
- 最新版本Photoshop CC2018软件安装教程(mac+windows全版本都有,包括2023