当前位置: 首页 > news >正文

linux shell 入门学习笔记18 函数开发

概念

函数就是将你需要执行的shell命令组合起来,组成一个函数体。一个完整的函数包括函数头和函数体,其中函数名就是函数的名字。

优点

  • 将相同的程序,定义,封装为一个函数,能减少程序的代码数量,提高开发效率。
  • 使用函数,能让你写更少的代码,早点写完,早点回家休息多好。
  • 函数能够增加代码的可读性,易读性,容器管理。

函数的实际开发

shell函数定义的语法

# 标准shell函数定义
function 函数名() {函数体你想执行的Linux命令return 返回值
}# 偷懒写法
# 当使用function关键字时候,可以省略括号
function 函数名 {函数体你想执行的那些命令。。。。return 返回值
}# 超人懒人写法,shell老司机的时候
# 必须有括号
函数名() {函数体代码。。。return 返回值
}# 执行该函数
函数名

执行函数的基础概念

有关函数执行的基本概念

  • 执行shell函数,直接写函数名字即可,无需添加其他内容
  • 函数必须先定义,在执行,shell脚本自上而下加载
  • 函数体内定义的变量,称之为局部变量
  • 函数体内需要添加return语句,作用是退出函数,且赋予返回值给调用该函数的程序,也就是shell脚本
  • return语句和exit不同
    • return是结束函数的执行,返回一个(退出值、返回值)
    • exit是结束shell环境,返回一个(退出值、返回值)给当前的shell
  • 函数如果单独写入一个文件里,需要用source读取
  • 函数内,使用local关键字,定义局部变量

函数实践

场景1:

xiao123@xiao123:~/Downloads/shscripts$ cat ./func1.sh
#! /bin/bashfunction chaochao() {cd /tmpecho "我准备创建一个文件,且写入信息"echo "爱的魔力转圈圈" > ./music.txtreturn 0
}chaochao
xiao123@xiao123:~/Downloads/shscripts$

运行结果:

xiao123@xiao123:~/Downloads/shscripts$ bash ./func1.sh
我准备创建一个文件,且写入信息
xiao123@xiao123:~/Downloads/shscripts$ ls /tmp/
message.txt
music.txt
xiao123@xiao123:~/Downloads/shscripts$
xiao123@xiao123:~/Downloads/shscripts$ cat /tmp/music.txt
爱的魔力转圈圈
xiao123@xiao123:~/Downloads/shscripts$

场景2:
函数定义和执行,分开在不同的文件中,Linux自带的诸多脚本,都是基于该形式使用的。

  • 函数写在一个文件中,只定义,不执行
  • 另外一个脚本,读取该文件,且加载该函数
1. 先定义一个my_function.c脚本,作用是只记录函数,不运行
xiao123@xiao123:~/Downloads/shscripts$ cat my_function.sh
#!/bin/bashchao(){echo "我是函数,我被执行~你真棒"
}
xiao123@xiao123:~/Downloads/shscripts$2.如何检查当前的shell环境变量
xiao123@xiao123:~/Downloads/shscripts$ set | grep ^chao
xiao123@xiao123:~/Downloads/shscripts$3.利用source命令读取shell脚本,能够加载其变量到当前shell环境中
xiao123@xiao123:~/Downloads/shscripts$ source my_function.sh
xiao123@xiao123:~/Downloads/shscripts$4.再次验证
xiao123@xiao123:~/Downloads/shscripts$ set | grep ^chao
chao ()
xiao123@xiao123:~/Downloads/shscripts$5.可以推出当前shell,再次登录,查看该环境变量
exit
xiao123@xiao123:~$ chao
Command 'chao' not found, did you mean:command 'chaos' from deb emboss (6.6.0+dfsg-11ubuntu1)command 'chat' from deb ppp (2.4.9-1+1ubuntu3)
Try: apt install <deb name>
xiao123@xiao123:~$xiao123@xiao123:~/Downloads/shscripts$ source my_function.sh
xiao123@xiao123:~/Downloads/shscripts$ set | grep ^chao
chao ()
xiao123@xiao123:~/Downloads/shscripts$ chao
我是函数,我被执行~你真棒
xiao123@xiao123:~/Downloads/shscripts$

使用脚本加载chao,并执行

xiao123@xiao123:~/Downloads/shscripts$ cat fun3.sh
#! /bin/bash[ -f ./my_function.sh ] && . my_function.sh || exit -1chao
xiao123@xiao123:~/Downloads/shscripts$xiao123@xiao123:~/Downloads/shscripts$ bash fun3.sh  #启动子shell,在子shell中加载
我是函数,我被执行~你真棒
xiao123@xiao123:~/Downloads/shscripts$xiao123@xiao123:~/Downloads/shscripts$ chao
\Command 'chao' not found, did you mean:command 'chat' from deb ppp (2.4.9-1+1ubuntu3)command 'chaos' from deb emboss (6.6.0+dfsg-11ubuntu1)
Try: apt install <deb name>
xiao123@xiao123:~/Downloads/shscripts$xiao123@xiao123:~/Downloads/shscripts$ source fun3.sh   # 在当前shell中加载
我是函数,我被执行~你真棒
xiao123@xiao123:~/Downloads/shscripts$ set | grep ^chao
chao ()
xiao123@xiao123:~/Downloads/shscripts$ chao
我是函数,我被执行~你真棒
xiao123@xiao123:~/Downloads/shscripts$

bash 开启子shell执行,source使用当前shell执行

函数处理参数

函数可以处理来自命令行传到shell脚本中的参数。

my_function.sh

xiao123@xiao123:~/Downloads/shscripts$ cat my_function.sh
#!/bin/bashchao(){echo "我是函数,我被执行~你真棒"
}helloPyyu(){echo "兄台,你传入的脚本参数,依次是 $1 $2 $3,并且参数个数一共是$#"
}
xiao123@xiao123:~/Downloads/shscripts$

fun3.sh

xiao123@xiao123:~/Downloads/shscripts$ cat fun3.sh
#! /bin/bash[ -f ./my_function.sh ] && . my_function.sh || exit -1helloPyyu $1 $2 $3
xiao123@xiao123:~/Downloads/shscripts$

运行结果

xiao123@xiao123:~/Downloads/shscripts$ bash fun3.sh
兄台,你传入的脚本参数,依次是   ,并且参数个数一共是0
xiao123@xiao123:~/Downloads/shscripts$ bash fun3.sh 2131 4543 5646 45645
兄台,你传入的脚本参数,依次是 2131 4543 5646,并且参数个数一共是3
xiao123@xiao123:~/Downloads/shscripts$ bash fun3.sh 2131 4543 5646
兄台,你传入的脚本参数,依次是 2131 4543 5646,并且参数个数一共是3
xiao123@xiao123:~/Downloads/shscripts$

函数实战开发

  1. 检测url是否正常,要求是函数开发形式
xiao123@xiao123:~/Downloads/shscripts$ cat check_url.sh
#!/bin/bashusage() {echo "Usage: $0 url"exit 1
}check_url() {wget --spider -q -o /dev/null --tries=1 -T 5 $1if [ $? -eq 0 ]thenecho "$1 is running..."elseecho "$1 is down..."fi
}main() {if [ $# -ne 1 ]thenusageficheck_url $1
}main $*
xiao123@xiao123:~/Downloads/shscripts$

运行结果

xiao123@xiao123:~/Downloads/shscripts$ bash check_url.sh www.baidu.com
www.baidu.com is running...
xiao123@xiao123:~/Downloads/shscripts$ bash check_url.sh www.baidu.coms
www.baidu.coms is down...
xiao123@xiao123:~/Downloads/shscripts$ bash check_url.sh www.baidu.coms  fd
Usage: check_url.sh url
xiao123@xiao123:~/Downloads/shscripts$ bash check_url.sh
Usage: check_url.sh url
xiao123@xiao123:~/Downloads/shscripts$

美化脚本

xiao123@xiao123:~/Downloads/shscripts$ cat check_url.sh
#!/bin/bash. /lib/lsb/init-functionsusage() {echo "Usage: $0 url"exit 1
}check_url() {wget --spider -q -o /dev/null --tries=1 -T 5 $1if [ $? -eq 0 ]thenlog_success_msg echo "$1 is running..."elselog_failure_msg "$1 is down..."fi
}main() {if [ $# -ne 1 ]thenusageficheck_url $1
}main $*
xiao123@xiao123:~/Downloads/shscripts$

运行结果:
slab

相关文章:

linux shell 入门学习笔记18 函数开发

概念 函数就是将你需要执行的shell命令组合起来&#xff0c;组成一个函数体。一个完整的函数包括函数头和函数体&#xff0c;其中函数名就是函数的名字。 优点 将相同的程序&#xff0c;定义&#xff0c;封装为一个函数&#xff0c;能减少程序的代码数量&#xff0c;提高开发…...

如何最巧妙回答HR面试“送命题”:你为什么离开上家公司?

一 HR面试存在“送命题”? 一个资深HR朋友聊到,他最近pass掉一个名校高材生。 其实洽谈过程还比较愉悦,小姑娘名校毕业,落落大方,薪酬要求比较合理,各方面都比较符合,最后就在决定要录用时,HR朋友随口问了句 “你为什么离开上家公司?”,小姑娘也是随口说了句“我不喜…...

注意力机制详解系列(五):分支与时间注意力机制

&#x1f468;‍&#x1f4bb;作者简介&#xff1a; 大数据专业硕士在读&#xff0c;CSDN人工智能领域博客专家&#xff0c;阿里云专家博主&#xff0c;专注大数据与人工智能知识分享&#xff0c;公众号&#xff1a;GoAI的学习小屋&#xff0c;免费分享书籍、简历、导图等资料&…...

创宇盾重保经验分享,看政府、央企如何防护?

三月重保已经迫近&#xff0c;留给我们的准备时间越来越少&#xff0c;综合近两年三月重保经验及数据总结&#xff0c;知道创宇用实际案例的防护效果说话&#xff0c;深入解析为何创宇盾可以在历次重保中保持“零事故”成绩&#xff0c;受到众多部委、政府、央企/国企客户的青睐…...

软件测试面试汇总

在浏览器中输入 URL&#xff0c;回车后发生了什么&#xff1f; 在浏览器中输入URL并按下回车键后&#xff0c;大致流程如下&#xff1a; 1、浏览器解析 URL&#xff0c;提取出协议&#xff08;例如HTTP、HTTPS)、主机名和路径等信息。 2、浏览器查找该URL的缓存记录&#xff0…...

空指针,野指针

空指针在C/C中&#xff0c;空指针&#xff08;null pointer&#xff09;是指向内存地址0的指针变量。NULL在C/C中的定义为&#xff1a;#ifndef NULL#ifdef __cplusplus#define NULL 0#else#define NULL ((void *)0)#endif #endif从上面的代码定义中&#xff0c;我们可以发现在C…...

Mysql Nested-Loop Join算法和MRR

MySQL8之前仅支持一种join 算法—— nested loop&#xff0c;在 MySQL8 中推出了一种新的算法 hash join&#xff0c;比 nested loop 更加高效。&#xff08;后面有时间介绍这种join算法&#xff09; 1、mysql驱动表与被驱动表及join优化 先了解在join连接时哪个表是驱动表&a…...

Spark 广播/累加

Spark 广播/累加广播变量普通变量广播分布式数据集广播克制 Shuffle强制广播配置项Join Hintsbroadcast累加器Spark 提供了两类共享变量&#xff1a;广播变量&#xff08;Broadcast variables&#xff09;/累加器&#xff08;Accumulators&#xff09; 广播变量 创建广播变量…...

飞天云动,站在下一个商业时代的门口

ChatGPT的爆火让AIGC再度成为热词&#xff0c;随之而来的是对其商业化的畅想——不是ChatGPT自身如何盈利&#xff0c;而是它乃至整个AIGC能给现在的商业环境带来多大改变。 这不由得令人想起另一个同样旨在改变世界的概念&#xff0c;元宇宙。不同的是&#xff0c;元宇宙更侧…...

上海分时电价机制调整对储能项目的影响分析

安科瑞 耿敏花 2022年12月16日&#xff0c;上海市发改委发布《关于进一步完善我市分时电价机制有关事项的通知》(沪发改价管〔2022〕50号)。通知明确上海分时电价机制&#xff0c;一般工商业及其他两部制、大工业两部制用电夏季&#xff08;7、8、9月&#xff09;和冬季&#x…...

产品新人如何快速上手工作

三百六十行&#xff0c;行行出产品经理&#xff1a;上至封神的乔布斯&#xff0c;下至卖鸡蛋罐饼的阿姨&#xff0c;他们对如何打造自己的产品都会有一套完整的产品思路&#xff0c;这也是为什么说“人人都是产品经理”。这个看似光鲜的“经理”有时也会被戏称产品汪&#xff0…...

Linux: ARM GIC仅中断CPU 0问题分析

文章目录1. 前言2. 分析背景3. 问题4. 分析4.1 ARM GIC 中断芯片简介4.1.1 中断类型和分布4.1.2 拓扑结构4.2 问题根因4.2.1 设置GIC SPI中断的CPU亲和性4.2.2 GIC初始化&#xff1a;缺省的CPU亲和性4.2.2.1 boot CPU亲和性初始化流程4.2.2.1 其它非 boot CPU亲和性初始化流程5…...

第20篇:Java运算符全面总结(系列二)

目录 4、逻辑运算符 4.1 逻辑运算符 4.2 代码示例 5、赋值运算符 5.1 赋值运算符...

OpenCV4.x图像处理实例-OpenCV两小时快速入门(基于Python)

OpenCV两小时快速入门(基于Python) 文章目录 OpenCV两小时快速入门(基于Python)1、OpenCV环境安装2、图像读取与显示3、图像像素访问、操作与ROI4、图像缩放5、几何变换5.1 平移5.2 旋转6、基本绘图6.1 绘制直线6.2 绘制圆6.3 绘制矩形6.4 绘制文本7、剪裁图像8、图像平滑与…...

【Git】Mac忽略.DS_Store文件

我们在github上经常看到某些仓库里面包含了.DS_Store文件&#xff0c;或者某些sdk的压缩包里面可以看到&#xff0c;这都是由于随着git的提交把这类文件也提交到仓库&#xff0c;压缩也是一样&#xff0c;压缩这个先留着后面处理。 Mac上的.DS_Store文件 .DS_Store 文件&#…...

12.2 基于Django的服务器信息查看应用(CPU信息)

文章目录CPU信息展示图表展示-视图函数设计图表展示-前端界面设计折线图和饼图展示饼图测试折线图celery和Django配合实现定时任务Windows安装redis根据数据库中的数据绘制CPU折线图CPU信息展示 图表展示-视图函数设计 host/views.py def cpu(request):logical_core_num ps…...

【软件测试】接口测试总结

本文主要分为两个部分&#xff1a; 第一部分&#xff1a;主要从问题出发&#xff0c;引入接口测试的相关内容并与前端测试进行简单对比&#xff0c;总结两者之前的区别与联系。但该部分只交代了怎么做和如何做&#xff1f;并没有解释为什么要做&#xff1f; 第二部分&#xff1…...

代码随想录算法训练营第52天 || 300.最长递增子序列 || 674. 最长连续递增序列 || 718. 最长重复子数组

代码随想录算法训练营第52天 || 300.最长递增子序列 || 674. 最长连续递增序列 || 718. 最长重复子数组 300.最长递增子序列 题目介绍 给你一个整数数组 nums &#xff0c;找到其中最长严格递增子序列的长度。 子序列 是由数组派生而来的序列&#xff0c;删除&#xff08;或…...

gitblit 安装使用

1 安装服务端 简而言之&#xff1a;需要安装 java&#xff0c;gitblit&#xff0c; git 三个软件 Windows 10环境使用Gitblit搭建局域网Git服务器 前言 安装Java并配置环境安装gitblit并配置启动gitblit为windows服务使用gitblit创建repository并管理用户 1.1 安装Java并配…...

使用 TensorFlow、Keras-OCR 和 OpenCV 从技术图纸中获取信息

简单介绍输入是技术绘图图像。对象检测模型获取图像后对其进行分类&#xff0c;找到边界框&#xff0c;分配维度&#xff0c;计算属性。示例图像&#xff08;输入&#xff09;分类后&#xff0c;找到“IPN”部分。之后&#xff0c;它计算属性&#xff0c;例如惯性矩。它适用于不…...

ESP32设备驱动-GUVA-S12SD紫外线检测传感器驱动

GUVA-S12SD紫外线检测传感器驱动 文章目录 GUVA-S12SD紫外线检测传感器驱动1、GUVA-S12SD介绍2、硬件准备3、软件准备4、驱动实现1、GUVA-S12SD介绍 GUVA-S12SD 紫外线传感器芯片适用于检测太阳光中的紫外线辐射。 它可用于任何需要监控紫外线量的应用,并且可以简单地连接到任…...

WIN7下 program file 权限不足?咋整?!!

在WIN7下对Program Files目录的权限问题 [问题点数&#xff1a;40分&#xff0c;结帖人mysunck] 大部分人说要使用manifest&#xff0c;但是其中一个人说&#xff1a; “安装程序要求管理员很正常&#xff0c;你的程序可以在programfiles,但用户数据不能放那里&#xff0c;因…...

119.(leaflet篇)文字碰撞

听老人家说:多看美女会长寿 地图之家总目录(订阅之前建议先查看该博客) 文章末尾处提供保证可运行完整代码包,运行如有问题,可“私信”博主。 效果如下所示: 下面献上完整代码,代码重要位置会做相应解释 <!DOCTYPE html> <html>...

cuda编程以及GPU基本知识

目录CPU与GPU的基本知识CPU特点GPU特点GPU vs. CPU什么样的问题适合GPU&#xff1f;GPU编程CUDA编程并行计算的整体流程CUDA编程术语&#xff1a;硬件CUDA编程术语&#xff1a;内存模型CUDA编程术语&#xff1a;软件线程块&#xff08;Thread Block&#xff09;网格&#xff08…...

Python 机器学习/深度学习/算法专栏 - 导读目录

目录 一.简介 二.机器学习 三.深度学习 四.数据结构与算法 五.日常工具 一.简介 Python 机器学习、深度学习、算法主要是博主从研究生到工作期间接触的一些机器学习、深度学习以及一些算法的实现的记录&#xff0c;从早期的 LR、SVM 到后期的 Deep&#xff0c;从学习到工…...

Springboot怎么实现restfult风格Api接口

前言在最近的一次技术评审会议上&#xff0c;听到有同事发言说&#xff1a;“我们的项目采用restful风格的接口设计&#xff0c;开发效率更高&#xff0c;接口扩展性更好...”&#xff0c;当我听到开头第一句&#xff0c;我脑子里就开始冒问号&#xff1a;项目里的接口用到的是…...

Jetpack Compose 深入探索系列六:Compose runtime 高级用例

Compose runtime vs Compose UI 在深入讨论之前&#xff0c;非常重要的一点是要区分 Compose UI 和 Compose runtime。Compose UI 是 Android 的新 UI 工具包&#xff0c;具有 LayoutNodes 的树形结构&#xff0c;它们稍后在画布上绘制其内容。Compose runtime 提供底层机制和…...

23.3.2 Codeforces Round #834 (Div. 3) A~E

FG明天补 A-Yes-Yes? 题面翻译 给定 ttt 个字符串&#xff0c;请判定这些字符串是否分别是 YesYesYesYes…\texttt{YesYesYesYes\dots}YesYesYesYes… 的子串。是则输出 YES&#xff0c;否则输出 NO&#xff08;YES 和 NO 大小写不定&#xff09;。 Translated by JYqwq …...

一次失败的面试经历:我只想找个工作,你却用面试题羞辱我!

金三银四近在咫尺&#xff0c;即将又是一波求职月&#xff0c;面对跳槽的高峰期&#xff0c;很多软件测试人员都希望能拿一个满意的高薪offer&#xff0c;但是随着招聘职位的不断增多&#xff0c;面试的难度也随之加大&#xff0c;而面试官更是会择优录取小王最近为面试已经焦头…...

java版工程管理系统 Spring Cloud+Spring Boot+Mybatis实现工程管理系统源码

java版工程管理系统Spring CloudSpring BootMybatis实现工程管理系统 工程项目各模块及其功能点清单 一、系统管理 1、数据字典&#xff1a;实现对数据字典标签的增删改查操作 2、编码管理&#xff1a;实现对系统编码的增删改查操作 3、用户管理&#xff1a;管理和…...

免费微信小程序制作/百度seo流量

链表05--复杂链表的复制-jz25题目概述解析&参考答案注意事项说明题目概述 算法说明 输入一个复杂链表&#xff08;每个节点中有节点值&#xff0c;以及两个指针&#xff0c;一个指向下一个节点&#xff0c;另一个特殊指针random指向一个随机节点&#xff09;&#xff0c;请…...

市政府网站集约化建设方案/如何做网站推广广告

嵌入式Linux ARM汇编(三)——ARM汇编指令(二)四、ARM存储器访问指令ARM处理器是加载/存储体系结构的典型RISC处理器&#xff0c;对存储器的访问只能用加载和存储指令实现。ARM的加载/存储指令可以实现字、半字、字节操作。1、LDR和STR加载/存储字和无符号字节指令。使用单一数据…...

wordpress添加icp/seo公司

简单HTTP数据请求 超文本传输协议 (HTTP) 用作客户端和服务器之间的请求-响应协议。本实例将演示如何通过ESP8266发起一个HTTP请求,向远程主机请求数据。 在开始本实例之前,首先准备一个可用的HTTP服务器,或一个可用的HTTP URL。在这里,通过Node-Red物联网编程环境创建一…...

交互式网站制作/东莞企业网站设计公司

了解生产中内部使用的API的性能是一项艰巨的任务。实际上&#xff0c;大多数团队还没有监控API。随着市场的变化&#xff0c;越来越多的团队将API监控作为Ops团队和QA团队的优先事项&#xff0c;因此每个版本都经过了适当的测试&#xff0c;并设置了一个监控器确保在生产环境中…...

西安网站托管排名/aso具体优化

一、准备&#xff1a; 1.1、GOPATH目录下的bin文件夹添加系统path变量中。 添加后可直接在任意位置控制台中直接调用bin目录下的可执行程序。 1.2、准备好自己的程序ico图标文件&#xff0c;放在main.go同级目录。 下文中提到的&#xff1a;控制台运行命令&#xff0c;都是在…...

企业做网站 里面都写什么/怎么做表格

目录​​​​​​​ 漏洞背景 漏洞影响版本 漏洞复现 漏洞利用 漏洞修复 漏洞背景 2020年09月08日微软发布漏洞通告:CVE-2020-16875 | Microsoft Exchange Server 远程执行代码漏洞 由于对cmdlet参数的验证不正确,Microsoft Exchange服务器中存在一个远程执行代码漏洞…...