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,一经查实,立即删除!

相关文章

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

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

Web后端基本设计思想

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

快速创建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)代码的复用…

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

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

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…

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

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

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…

在线餐饮油烟实时监测系统的设计与实现

安科瑞 华楠 摘 要&#xff1a;为了解决传统油烟检测方法中成本高、效率低、实时性差等问题&#xff0c;设计开发了一种在线油烟实时监测系统&#xff1b;系统由采集、通讯、服务器和用户交互四个模块组成&#xff1b;采集模块采集油烟数据&#xff0c;通过GPRS通讯技术将数据发…

KL15 是什么?ACC,crank,on等

KL含义 KL is the abbreviation for klemme which is the German term for connector / connection.KL是“ klemme”的缩写&#xff0c;这是德语中连接器或连接的术语。 KL30 &#xff0c;通常表示电瓶的正极。positive KL31&#xff0c;通常表示电瓶的负极。negative KL15, 通…

面试题:JS中的String常见方法有哪些?

面试题&#xff1a;说不出五个就尴尬了&#xff01;我目前只写了几个方法&#xff0c;待更新中。。。 1、length2、slice()3、substr()4、substring()5、split()6、indexOf() 1、length 作用&#xff1a;检测字符串的长度。 let str abcde console.log(str.length) // 52、sl…

微信小程序 - scroll-view组件之上拉加载下拉刷新(解决上拉加载不触发)

前言 最近在做微信小程序项目中&#xff0c;有一个功能就是做一个商品列表分页限流然后实现上拉加载下拉刷新功能&#xff0c;遇到了一个使用scroll-viwe组件下拉刷新事件始终不触发问题&#xff0c;网上很多说给scroll-view设置一个高度啥的就可以解决&#xff0c;有些人设置了…

hadoop与HDFS交互

一、利用Shell命令与HDFS进行交互 在进行HDFS编程实践前&#xff0c;需要首先启动Hadoop。可以执行如下命令启动Hadoop&#xff1a; cd /usr/local/hadoop ./sbin/start-dfs.sh #启动hadoop Hadoop支持很多Shell命令&#xff0c;其中fs是HDFS最常用的命令&#xff0c;利用fs…

HCIA-datacom数通题库和录播视频资料

HCIA-Datacom&#xff0c;是华为数通认证的初级考试&#xff0c;培训与认证具备数通基础通用知识和技能水平的工程师&#xff0c;只是入门了解数通的一些基础通用知识&#xff0c;适用于小白了解和学习数通知识点起点。 个人建议还是有必要考的&#xff0c;如果在企业考试考试…

Kubernetes (k8s)理论介绍

一&#xff1a;K8s 简介 1、K8s作用 2、K8s 来历 3、为什么要用 K8S? 4、Kubernetes 功能 二&#xff1a;Kubernetes 集群架构与组件 1、Kubernetes 集群架构与组件 2、核心组件 -Master 组件 &#xff08;1&#xff09;Kube-apiserver &#xff08;2&#xff09;Kube…