网站首页 > 技术文章 正文
大家好呀,好久不见,经过前面几章的学习,想必大家都已经对shell脚本有了比较深入的了解了,然后也可以自己写一些简单的shell脚本来自动化起来,提高自己工作时候的效率了。我们前几章对Shell脚本的变量,流程控制,脚本的简单实践等都做了系统性的介绍,这节课的话打算给大家介绍一下Shell脚本语法相关的最后一节内容,那就是Shell脚本的函数和模块的概念,以及如何归拢较为大型的Shell脚本。这章介绍完之后,会给大家继续介绍linux 上较长使用的命令和工具,如awk, sed, grep, vim的使用等,以便让大家真正入门且在工作中能熟练的熟悉使用Shell 进行生产工作。
老套路,如果忘记了前面几期内容,想要回顾一下的话,请看下面链接:
Shell脚本怎么写?(1-2)——Shell 变量的高级用法
然后,今天的内容也会从一个示例程序说起,
示例如下:
如上图,我们编写了一个世界上最简单的Shell 脚本程序。
运行结果如下:
然后,我们需要给大家归纳一下,Shell 函数的定义语法,具体如下:
[ function ] funname [()] //前面的function关键字可以省略
{
action;
[return int;] // 函数存在 return 语法
}
下面我们看一下函数的返回值如何处理。我们编写一个有返回值的Shell 函数,示例如下:
如上图,我们定义了一个函数,执行后可以输入两个值,并返回两个值的和。
值得注意的是,shell脚本中如果要返回一个值,并不是直接使用一个变量去接收函数的返回值的,而是使用了Shell 的特殊变量 $? , 这个特殊系统变量我们在Shell 变量高级篇那章给大家介绍过了,它代表的就是Shell 上一条语句执行结果的返回值。
这个示例的其它地方不再赘述,都是使用过和讲过的内容了。
好了,至此,我们已经知道了Shell 脚本的函数语法和定义方法,已经如何从Shell 函数中返回值以及使用返回值。
对于函数,我们还差一部分,那就是函数的入参怎么表示呢?
如果一个Shell 函数接收两个入参,怎么实现这种语法?
接下来还是请看示例:
如上图所示,是一个简单的使用入参的Shell 函数,我们分别打印了第1个,第2个,第6个和第9个参数(这个参数是空,调用时,只传了六个参数),并且打印了所有的参数。
调用传参的方式就是 funcname xxx xxx xxx 后面跟着参数。
这个也是在Shell 变量的高级使用那章讲过的内容,使用Shell 内部的系统变量进行函数参数的传递和使用。
上图的简单Shell 脚本的运行结果如下所示:
好的,综上,我们就把Shell脚本的函数定义,入参,返回值相关语法和使用都介绍明白了。然后,我们下一步就是讲讲Shell 中的模块的概念。(官方也有说法叫做Shell 的文件包含)。
我们还是老规矩,先给一个场景,再看如何办?
比如我们现在有两个Shell 脚本文件。
第一个Shell 脚本是我们自己编写的一个数学函数库,提供数学运算的函数,我们把它命名为math.sh, math.sh 的内容如下:
然后我们想在其它Shell 脚本中使用这俩函数,那应该咋办呢?
比如我们有个toutiao.sh 的文件,我们以前基本上所有的示例都是在这个文件里编写完成的,现在我就想在这个文件中,调用math.sh 中的这两个函数,如何操作呢?
额,不卖关子了,示例如下:
最关键的一句语法是source xxx.sh, 我们在主shell 文件中,使用source math.sh 即可把math.sh 中定义的函数引入到主toutiao.sh 中来,然后直接进行函数调用即可。
上面的函数执行结果如下所示:
好了,如上就是我们今天想要给大家介绍的内容了,懂得如何使用函数和模块,我们就可以聚焦在某个核心功能点的编写,然后通过合理的划分功能模块的方式,提高Shell脚本程序的复用率,写出更加模块化和更加复杂的Shell脚本功能。
Shell脚本在linux 上,虽然使用的越来越少(大多还是被python自动化脚本替代,介绍python自动化脚本那期介绍过原因),但是,在一些老设备的现网和商用环境下,大家如果在工作中需要维护这样的项目,那必然是会接触到大量的Shell脚本的。比如高通芯片驱动的编译基本都是使用shell脚本,Android 的版本编译使用的Android.mk + Shell 脚本等等吧。
希望通过我的介绍,大家有所收获,如果您觉得文章还不错的话,别忘了点赞收藏,关注我,你的关注就是我的动力,我会发布越来越实用的文章,给大家进行工作中常用的IT技能科普。
猜你喜欢
- 2024-10-27 NDK开发——FFmpeg视频解码 ffmpeg ndk
- 2024-10-27 Camera基本代码架构 camera calibrator
- 2024-10-27 android 功耗分析方法和优化(1) 功耗app
- 2024-10-27 Cocos Creator v2.3.2 发布了!全新 Launcher 效率飞起!
- 2024-10-27 如何androd动态注册编写计算器 淘宝动态评分计算器在线
- 2024-10-27 高通平台OV8856 Camera的bring up总结
- 2024-10-27 高通平台移植GC2145 Camera驱动 高通驱动安装
- 2024-10-27 《坎公骑冠剑》光炮Android Mk.99技能与背景故事
- 2024-10-27 ubuntu移植libwebp到Android平台 ubuntu移植到arm
- 2024-10-27 步步为营,十分钟学会 Native JNI(附带彩蛋)
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- oraclesql优化 (66)
- 类的加载机制 (75)
- feignclient (62)
- 一致性hash算法 (71)
- dockfile (66)
- 锁机制 (57)
- javaresponse (60)
- 查看hive版本 (59)
- phpworkerman (57)
- spark算子 (58)
- vue双向绑定的原理 (68)
- springbootget请求 (58)
- docker网络三种模式 (67)
- spring控制反转 (71)
- data:image/jpeg (69)
- base64 (69)
- java分页 (64)
- kibanadocker (60)
- qabstracttablemodel (62)
- java生成pdf文件 (69)
- deletelater (62)
- com.aspose.words (58)
- android.mk (62)
- qopengl (73)
- epoch_millis (61)
本文暂时没有评论,来添加一个吧(●'◡'●)