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$
函数实战开发
- 检测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$
运行结果:
相关文章:

linux shell 入门学习笔记18 函数开发
概念 函数就是将你需要执行的shell命令组合起来,组成一个函数体。一个完整的函数包括函数头和函数体,其中函数名就是函数的名字。 优点 将相同的程序,定义,封装为一个函数,能减少程序的代码数量,提高开发…...
如何最巧妙回答HR面试“送命题”:你为什么离开上家公司?
一 HR面试存在“送命题”? 一个资深HR朋友聊到,他最近pass掉一个名校高材生。 其实洽谈过程还比较愉悦,小姑娘名校毕业,落落大方,薪酬要求比较合理,各方面都比较符合,最后就在决定要录用时,HR朋友随口问了句 “你为什么离开上家公司?”,小姑娘也是随口说了句“我不喜…...

注意力机制详解系列(五):分支与时间注意力机制
👨💻作者简介: 大数据专业硕士在读,CSDN人工智能领域博客专家,阿里云专家博主,专注大数据与人工智能知识分享,公众号:GoAI的学习小屋,免费分享书籍、简历、导图等资料&…...

创宇盾重保经验分享,看政府、央企如何防护?
三月重保已经迫近,留给我们的准备时间越来越少,综合近两年三月重保经验及数据总结,知道创宇用实际案例的防护效果说话,深入解析为何创宇盾可以在历次重保中保持“零事故”成绩,受到众多部委、政府、央企/国企客户的青睐…...
软件测试面试汇总
在浏览器中输入 URL,回车后发生了什么? 在浏览器中输入URL并按下回车键后,大致流程如下: 1、浏览器解析 URL,提取出协议(例如HTTP、HTTPS)、主机名和路径等信息。 2、浏览器查找该URL的缓存记录࿰…...

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

Mysql Nested-Loop Join算法和MRR
MySQL8之前仅支持一种join 算法—— nested loop,在 MySQL8 中推出了一种新的算法 hash join,比 nested loop 更加高效。(后面有时间介绍这种join算法) 1、mysql驱动表与被驱动表及join优化 先了解在join连接时哪个表是驱动表&a…...

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

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

上海分时电价机制调整对储能项目的影响分析
安科瑞 耿敏花 2022年12月16日,上海市发改委发布《关于进一步完善我市分时电价机制有关事项的通知》(沪发改价管〔2022〕50号)。通知明确上海分时电价机制,一般工商业及其他两部制、大工业两部制用电夏季(7、8、9月)和冬季&#x…...
产品新人如何快速上手工作
三百六十行,行行出产品经理:上至封神的乔布斯,下至卖鸡蛋罐饼的阿姨,他们对如何打造自己的产品都会有一套完整的产品思路,这也是为什么说“人人都是产品经理”。这个看似光鲜的“经理”有时也会被戏称产品汪࿰…...

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初始化:缺省的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文件,或者某些sdk的压缩包里面可以看到,这都是由于随着git的提交把这类文件也提交到仓库,压缩也是一样,压缩这个先留着后面处理。 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…...

【软件测试】接口测试总结
本文主要分为两个部分: 第一部分:主要从问题出发,引入接口测试的相关内容并与前端测试进行简单对比,总结两者之前的区别与联系。但该部分只交代了怎么做和如何做?并没有解释为什么要做? 第二部分࿱…...
代码随想录算法训练营第52天 || 300.最长递增子序列 || 674. 最长连续递增序列 || 718. 最长重复子数组
代码随想录算法训练营第52天 || 300.最长递增子序列 || 674. 最长连续递增序列 || 718. 最长重复子数组 300.最长递增子序列 题目介绍 给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。 子序列 是由数组派生而来的序列,删除(或…...

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

使用 TensorFlow、Keras-OCR 和 OpenCV 从技术图纸中获取信息
简单介绍输入是技术绘图图像。对象检测模型获取图像后对其进行分类,找到边界框,分配维度,计算属性。示例图像(输入)分类后,找到“IPN”部分。之后,它计算属性,例如惯性矩。它适用于不…...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...

【Python】 -- 趣味代码 - 小恐龙游戏
文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...

如何在看板中体现优先级变化
在看板中有效体现优先级变化的关键措施包括:采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中,设置任务排序规则尤其重要,因为它让看板视觉上直观地体…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件
今天呢,博主的学习进度也是步入了Java Mybatis 框架,目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正确的建议&…...

聊聊 Pulsar:Producer 源码解析
一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台,以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中,Producer(生产者) 是连接客户端应用与消息队列的第一步。生产者…...
Leetcode 3577. Count the Number of Computer Unlocking Permutations
Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接:3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯,要想要能够将所有的电脑解锁&#x…...

多种风格导航菜单 HTML 实现(附源码)
下面我将为您展示 6 种不同风格的导航菜单实现,每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...

C# 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
Go 语言并发编程基础:无缓冲与有缓冲通道
在上一章节中,我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道,它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好࿰…...

力扣热题100 k个一组反转链表题解
题目: 代码: func reverseKGroup(head *ListNode, k int) *ListNode {cur : headfor i : 0; i < k; i {if cur nil {return head}cur cur.Next}newHead : reverse(head, cur)head.Next reverseKGroup(cur, k)return newHead }func reverse(start, end *ListNode) *ListN…...