Shell脚本学习-Shell函数

函数的作用就是将程序里多次被调用的相同代码组合起来(函数体),并为其取一个名字,即函数名。其他所有想重复调用这部分代码的地方都只需要调用这个名字就可以了。当需要修改这部分代码时候,只需要修改函数体内的这部分代码即可实现对所有调用的修改,也可以把函数独立地写在文件里,当需要调用函数时,再加载进来使用。

好处:

1)把相同的程序段定义成函数,可以减少程序代码量;

2)增加程序的可读性,易读性;

3)呈现程序的功能模块化,使得程序具备通用性(可移植性)。

语法:

function 函数名() {指令...return n
}函数名() {指令...return n
}

执行:

1)执行不带参数的函数,直接输入函数名即可。

2)执行带参数的函数:

函数名  参数1  参数2

3)函数的执行必须要在执行的程序前面定义和加载。

4)Shell执行系统中各种程序的执行顺序:系统别名-》函数-》系统命令-》可执行文件。

5)函数执行的时候,会和调用它的脚本公用变量,也可以为函数设定局部变量及特殊位置参数。

6)函数体中的return语句会返回一个退出值(返回值)给调用函数的当前程序。

7)如果将函数存放在一个独立的文件中,被脚本加载使用的时候,需要使用source或者点号来加载。

8)在函数内一般使用local定义局部变量,这些变量离开函数后,就会消失。

9)Shell的位置参数($1/$2/$#/$*/$?/$@)都可以作为函数的参数来使用。

10)此时的父脚本的参数临时地被函数参数所掩盖或者隐藏。

11)$0 比较特殊,他仍然是父脚本的名称。

12)当函数执行完成时,原来的命令行脚本的参数即可恢复。

13)函数的参数变量是在函数体里面定义的。

示例1:

[root@vm1 scripts]# cat function01.sh
#!/bin/bashchang(){echo "I am chang."
}chun() {echo "I am chun."
}chang  # 调用chang
chun   #调用chun
[root@vm1 scripts]#  sh function01.sh
I am chang.
I am chun.

示例2:

分离函数体和执行函数的脚本文件(更规范的方法)

首先是建立函数体脚本(默认不会执行函数)。

使用cat命令追加多行脚本,以将函数代码追加到系统的函数文件中,即/etc/init.d/functions。

注意的是:要将定义的函数放在return 0的上面。如果放在return 0语句的下面,将无法调用到oldboy函数。在/etc/init.d/functions系统函数文件中添加的函数将不起作用。

然后在编辑脚本:

[root@vm1 scripts]# cat function02.sh
#!/bin/bash
#
[ -f /etc/init.d/functions ] && . /etc/init.d/functions || exit 1oldboy
[root@vm1 scripts]# sh function02.sh
I am oldboy

 

程序和函数分离的常见方法:

[root@vm1 scripts]# cat fun02.sh
#!/bin/bash# 在函数文件中只定义函数
# 可以在该函数文件中定义更多的函数
fun_01(){echo "I am oldboy linux."
}[root@vm1 scripts]# cat exec01.sh
#!/bin/bash
#
[ -f fun02.sh ] && . ./fun02.sh || exit 1# 执行函数
fun_01[root@vm1 scripts]# sh exec01.sh
I am oldboy linux.

说明:

1)在函数文件中可以定义多个函数。

2)我们可以创建单独的函数文件,然后加载这个函数文件,而不需要使用系统的函数文件/etc/init.d/functions。

3)这是一个比较规范的方法。

示例3:带参数的shell函数。

[root@vm1 scripts]# cat fun02.sh
#!/bin/bash# 在函数文件中只定义函数
# 可以在该函数文件中定义更多的函数
fun_01(){echo "I am oldboy linux."
}# 带参数的函数
fun_02(){echo "I am $1"
}[root@vm1 scripts]# cat exec01.sh
#!/bin/bash
#
[ -f fun02.sh ] && . ./fun02.sh || exit 1# 执行带参数的函数,这个$1本身是脚本的位置参数,但是$1占据的位置为函数的参数位置,现在它们重合了。
fun_02 $1# 将changchunhua作为参数
[root@vm1 scripts]# sh exec01.sh changchunhua
I am changchunhua

 说明:

此时的父脚本的参数临时地被函数参数所掩盖或者隐藏。

案例:利用shell函数开发企业级URL检测脚本:

[root@vm1 scripts]# cat url_check.sh
#!/bin/bashif [ $# -ne 1 ]thenecho "USAGE: $0 URL"exit 1
fiwget --spider --timeout 10 --tries=2 $1 &>/dev/nullif [ $? -eq 0 ]thenecho "$1 is yes."
elseecho "$1 is no."
fi

测试结果:

[root@vm1 scripts]# sh url_check.sh www.baidu.com
www.baidu.com is yes.[root@vm1 scripts]# sh url_check.sh jd.com
jd.com is yes.

然后,我们再进行一次升级:

将检测的功能写成函数,并将函数传参转换成脚本命令行传参,判断任意指定的url是否存在异常。

[root@vm1 scripts]# cat url_check2.sh
#!/bin/bash# 帮助函数
function usage(){echo "USAGE: $0 url"exit 1
}# 检测URL函数
function check_url(){wget --spider --timeout 10 --tries=2 $1 &>/dev/nullif [ $? -eq 0 ]thenecho "$1 is yes."elseecho "$1 is no."fi
}# 主函数
function main(){if [ $# -ne 1 ]  # 如果传入的是多个参数,则打印帮助函数,提示用户。thenusageficheck_url $1
}main $*  # 这里的$*就是把命令行接受的所有参数作为函数参数传给函数的内部,是一种常用的手法

学习了函数以后,尽量将脚本功能模块化,每个模块实现一个功能,并且让脚本可以通用。

工作中使用的一些Shell脚本,有时间也是需要进行升级修改,将脚本功能模块化。

 

然后我们使用更加专业的显示输出:

[root@vm1 scripts]# cat url_check3.sh
#!/bin/bash[ -f /etc/init.d/functions ] && . /etc/init.d/functions || exit 1# 帮助函数
function usage(){echo "USAGE: $0 url"exit 1
}# 检测URL函数
function check_url(){wget --spider --timeout 10 --tries=2 $1 &>/dev/nullif [ $? -eq 0 ]then# echo "$1 is yes."action "$1 is yes." /bin/trueelse# echo "$1 is no."action "$1 is no." /bin/truefi
}function main(){if [ $# -ne 1 ]thenusageficheck_url $1
}main $*  # 这里的$*就是把命令行接受的所有参数作为函数参数传给函数的内部,是一种常用的手法

执行结果:

[root@vm1 scripts]# sh url_check3.sh jd.com
jd.com is yes.                                             [  OK  ]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/18513.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

NOI2023 打金记

Day -4 最后一场模拟赛,肯定要用力打啊! 然而一题不会,呜呜呜。 于是开始拼暴力,写了 90 60 60 210 90 60 60 210 906060210,结果挂成 40 60 60 160 40 60 60 160 406060160。 T1 我将题目转化为&am…

【简单认识GFS分布式文件系统】

文章目录 一.GlusterFS 概述1.GlusterFS简介2.特点3.GlusterFS 术语4.模块化堆栈式架构5.GlusterFS 的工作流程6.GlusterFS的卷类型1、**分布式卷(Distribute volume)**2、条带卷(Stripe volume)3、复制卷(Replica vol…

JS检测属性位于对象本身还是来自于其原型链

学习原型链时有这个疑问,之前查过了但是老是忘记,现在记录一下,避免忘记。 参考:https://blog.csdn.net/weixin_40920953/article/details/88295651 1.in操作符 in 操作符会在通过对象能够访问给定属性时返回true,无…

Web后端基本设计思想

JavaWeb应用的后端一般基于MVC和三层架构思想实现。 MVC是一种设计模式,用于开发用户界面和交互式应用程序。M即Model,业务模型,负责处理应用程序的业务逻辑和数据;V即View,视图,负责给用户展示界面和数据&…

在一台电脑上,如何配置多个SSH Key?

场景描述 开发人员通常只会生成一个SSH Key,名字叫id_rsa,然后提交到多个不同的网站(如:GitHub、CodeArts或Gitee)。 但是也存在另一种需要,在同一个网站上,注册了两个用户名,通常…

快速创建vue3+vite+ts项目

安装nodejs 创建项目 npm init vitelatest 默认之后回车 选择项目名字my-vue-project 选择vue框架 选择ts 运行项目 cd my-vue-project npm install --registryhttps://registry.npm.taobao.org npm run dev

Vue2 第十二节 Vue组件化编程(一)

1.模块与组件,模块化与组件化概念 2. 非单文件组件 3. 组件编写注意事项 4. 组件的嵌套 一. 模块与组件,模块化与组件化 传统方式编写存在的问题 (1)依赖关系混乱,不好维护 (2)代码的复用…

ROI draw_rake

dev_get_window (WindowHandle) dev_set_color (green) * 1. 创建ROI draw_rake函数 Elements:20 DetectHeight:120 DetectWidth:35 draw_rake (Regions, WindowHandle, Elements, DetectHeight, DetectWidth, Row1, Column1, Row2, Column2) 绘制过程中,需要沿着…

炒股杠杆途乐证券;股票买入卖出时间规则?

股票买入卖出时刻规则是指出资者在股票商场上进行生意交易时需求遵循的一系列时刻规定。正确的买入和卖出时刻能够协助出资者最大化出资回报,一起降低风险。但是,在股票商场上,生意时刻的挑选是一个复杂的问题,需求从多个角度剖析…

Vue上线打包优化

Vue上线打包优化 在开发Vue项目时,我们通常需要对项目进行打包和优化,以便在生产环境中提供更高性能的应用程序。本篇博客将介绍一些Vue上线打包优化的技巧,帮助您优化应用程序的加载速度和性能。 一、禁止生成sourceMap文件 Vue项目在打包…

vSphere ESXI 7.0 网络规划

ESXi 网络 业务网络、Vmotion(漂移)、管理网络、存储网络 ESXi 管理网络 vCenter Server 管理网络 vCenter Server SSO域名 Single Sign-on域名:在没有指定的情况下,默认填写 vsphere.local VMware vSphere整体解决方案和网络…

汽车行业案例 | 联合汽车电子全新质量问题管理平台上线,燕千云助力汽车电子领军者实现数字化质量管理

据权威调研机构显示,2022年中国智能电动汽车的销量已占新能源汽车的52%以上。到2025年,在新能源汽车50%的汽车出行市场渗透率的基础上,智能电动汽车的销量将超1220万辆,占新能源汽车的80.1%。在技术进步和产业变革快速推进的背景下…

git常用指令

git add命令 作用:移动文件:工作区-->暂存区 git add .:把所有文件都放到暂存区 git commit命令 作用:移动文件:暂存区-->本地仓库 git status命令 作用:查看修改状态 git log命令 作用&#xf…

设计模式七:适配器模式(Adapter Pattern)

适配器模式(Adapter Pattern)是一种结构型设计模式,用于将一个类的接口转换成客户端所期望的另一个接口。它允许不兼容的接口能够协同工作。 适配器模式涉及角色: 目标接口(Target Interface)&#xff1a…

嵌入式软件开发有没有捷径

嵌入式软件开发有没有什么捷径?不定期会收到类似的问题,我只想说:嵌入式软件开发没有捷径 说实话,有这种想法的人,我其实想劝你放弃。对于绝大多数普通人,一步一个脚印就是捷径。 当然,这个问题…

4-7月预测价差方向准确率统计

月度 预测价差方向准确率 4月 33.6% 5月 28.4% 6月 25.7% 7月 34.2% 4-7月合计 30.6%

VLAN介绍

目录 VLAN的特点: VLAN的好处: VLAN的实现原理 VLAN标签 VLAN的划分方式 接口划分VLAN--接口类型 Access接口 Trunk接口 Hybrid接口 实现VLAN之间通信 使用路由器物理接口 使用子接口 使用三层交换机的VLANIF接口 配置 VLANIF的转发流程 三层交换机参与下的三层…

IDEA偶尔编译的时候不识别lombok

偶尔IDEA启动项目的时候会识别不到lombok,识别不到get()跟set()方法 方案 在settings添加下面代码 -Djps.track.ap.dependenciesfalse

dialog => :before-close的属性应用

在element-ui里面关闭弹窗的时候before-close会触发。 也就是点击X的时候回触发before-close这个属性, 代码实例: <el-dialogtitle"新增用户":visible.sync"dialogVisible"width"50%":before-close"handleClose"> handleClose…

linux学习笔记(2)----汇编LED灯实验

MX6ULL 的 IO IO的复用功能 这里的只使用了低五位&#xff0c;用来配置io口&#xff0c;其中bit0~bit3(MUX_MODE)就是设置 GPIO1_IO00 的复用功能的&#xff0c;GPIO1_IO00 一共可以复用为 9种功能 IO&#xff0c;分别对应 ALT0~ALT8。每种对应了不同的功能 io的属性配置 HY…