Shell脚本——函数的使用

一、函数

1.函数的作用

定义较为复杂的但是需要重复使用的内容以便再次使用可以直接调用函数节约时间,提高效率

在编写脚本时,有些脚本可以反复使用,可以调用函数来解决,语句块定义成函数约等于别名

函数定义:封装的可重复利用的具有特定功能的代码

使用函数可以避免代码重复,增加可读性,简化脚本
使用函数可以将大的工程分割为若干小的功能模块,代码的可读性更强

函数使用步骤

①首先是定义函数

②其次是调用函数(注意:若定义完成不调用则函数无效)

③查看系统限制所有函数:declare -F

④查看函数定义详细内容:declare -f  函数名

⑤删除函数 :unset  函数名

函数使用方法:

1. 定义函数  2. 再引用函数

2.函数的基本格式

第一种:

[function] 函数名 (){
	命令序列
	[return x]         #使用return或者exit可以显式的结束函数
}

第二种:

一般用这一种

函数名(){
	命令序列
}

第三种:

​
function  函数名 {

函数内容

}

​

实验1:用函数 判断操作系统是centos 还是ubuntu

#!/bin/bash

os () {
if grep -q centos /etc/os-release ;then
echo "操作系统是centos"
elif grep -q ubuntu /etc/os-release ;then
echo "操作系统是ubuntu"
else
echo "操作系统按不支持"
fi
}

os

判断操作系统是centos 还是ubuntu

实验2:建立专门的函数文件

 接着上面继续, 这是在data下

然后调用就可以了

我们模拟下在 ~家目录下:

color ()[
red="echo -eE[31m"
green="echo -e E[32m'
end="\E[Om"

3.注意事项

  1. 直接写 函数中调用函数 直接写函数名

  2. 同名函数 后一个生效

  3. 调用函数一定要先定义

  4. 每个函数是独立

declare -F
#查看当前已定义的函数名
declare -f
#查看当前已定义的函数定义
declare -f func_name 
#查看指定当前已定义的函数名
declare -F func_name
#查看当前已定义的函数名定义

4.删除函数

删除函数 :unset  函数名

5.函数的返回值

return表示退出函数并返回一个退出值,脚本中可以用S?变量显示该值

使用原则:
函数一结束就取返回值,因为S?变量只返回执行的最后一条命令的退出状态码

退出状态码必须是0~255,超出时值将为除以256取余

return
函数的退出状态码:
默认取决于函数中执行的最后一条命令的退出状态码

自定义退出状态码,其格式为:
return 从函数中返回,用最后状态命令决定返回值
return 0无错误返回
return 1-255 有错误返回

return 只能用在函数中

#!/bin/bash

ip () {
read -p "请输入一个ip地址: "  host
[[ "$host"  =~  ^([0-9]{1,3}\.){3}[0-9]{1,3}$ ]] || { echo "ip 地址不合法" ;return
 1; }
}

ip

实验1:判断输入IP地址正确与否

实验2:判断是否为管理员用户登录

#!/bin/bash
user () {
if [ $USER = root ]
 then echo "这是管理员用户"
else
echo "这不是管理员用户"
return 1
fi
}
user

6.函数的传参数

实验:

我们修改脚本,模式换下位置:

一般不会这样的,按着顺序来下哦

7.使用函数文件

我们可以新建一个专门存放函数的文件 (参考标题2)

8.函数的作用范围

函数在shell脚本中仅在当前的shell环境中有效

shell脚本中函数的变量默认全局有效

将变量限定在函数内部使用local命令

9. 函数递归

函数调用自己本身的函数,必须要有结束函数的语句,防止死循环

阶乘

阶乘是基斯顿·卡曼于 1808 年发明的运算符号,是数学术语

一个正整数的阶乘 (factorial) 是所有小于及等于该数的正整数的积,并且0和1的阶乘为1,自然数n的阶乘写作n!
n!=1x2x3x...xn

阶乘亦可以递归方式定义: 0!=1,n!=(n-1)!xn
n!=n(n-1)(n-2)...1
n(n-1)! = n(n-1)(n-2)!

! 表示阶乘

0!=1

1=1X0!

2!=2x1!

3!=3x2!

4!=4x3!

实验1:用 for 循环写阶乘
​
#!/bin/bash
read -p "请输入一个正整数:" num
sum=1
for i in `seq $num`
do
let sum=$[i*sum]
done
echo "阶乘结果是" $sum

​

实验2:用函数写阶乘
​
#!/bin/bash

fact () {

if [  $1 -eq  1  ]
then
echo 1
else
local temp=$[$1-1]
local result=`fact $temp`
echo "$[$1 * result]"

fi
}

fact $1

​

帮助理解下,如图:

实验:使用函数一键安装nginx脚本

先去nginx官网,下载,鼠标右击复制连接

nginx.org非盈利组织,开源不一定免费 ,只有新机器才需要安装

可以过滤下CPU

#!/bin/bash
cpu=`lscpu |grep "CPU(s)"|awk '{print$2}'|head -n1`
read -p "输入安装目录(绝对路径):" dir
cd /data
wget http://nginx.org/download/nginx-1.18.0.tar.gz  &>/dev/null
tar xf nginx-1.18.0.tar.gz
yum -y install gcc  gcc-c++  pcre-devel openssl-devel zlib-devel openssl  openssl-devel &>/dev/null
cd /data/nginx-1.18.0
./configure --prefix=$dir &>/dev/null
make -j $cpu  &>/dev/null
make install  &>/dev/null
 if [ $? -eq 0 ]
 then
 echo "安装成功"
 else
 echo "安装失败"
 fi

二、数组

1.前言

将全班学生定义成一个变量,无法使用普通变量。

  • 普通数组

  • 关联数组

变量和属组

  • 变量:存储单个元素的内存空间

  • 数组:存储多个元素的连续的内存空间,相当于多个变量的集合

数组名和索引

  • 索引的编号从0开始,属于数值索引

  • 索引可支持使用自定义的格式,而不仅是数值格式,即为关联索引,bash 4.0版本之后开始支持

  • bash的数组支持稀疏格式(索引不连续)

2.shell数组的定义

数组中可以存放多个值,Bash Shell 只支持一维数组(不支持多维数组)

数组元素的下标由 0 开始

Shell 数组用括号来表示,元素用"空格"符号分割开

在shell语句中,使用、遍历数组的时候,数组格式要写成 ${arr[@]} 或 ${arr[*]}

3.定义数组格式

方法一:

数组名=(value1 value2 ... valuen)
[root@zzh data]#a=(1 2 3 4 5)
[root@zzh data]#echo ${a[@]}
1 2 3 4 5

方法二:

数组名=([0]=value0 [1]=value0 [2]=value0 ...)
[root@zzh data]#b=([0]=1 [1]=2 [2]=3 [3]=4 [4]=5)
[root@zzh data]#echo ${b[@]}
1 2 3 4 5

方法三:

数组名[0]="value"
数组名[1]="value"
数组名[2]="value"
 
[root@localhost data03]#c[0]=1
[root@localhost data03]#c[1]=2
[root@localhost data03]#c[2]=3
[root@localhost data03]#c[3]=4
[root@localhost data03]#echo ${c[@]}
1 2 3 4

4.获取数组的数据列表

echo ${数组名[*]}
echo ${数组名[@]}

实验:使用函数 随机点名

#!/bin/bash
a=(xm xh xl xw lzl zs)
num=`echo $[RANDOM%6]`
echo ${a[$num]}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

51-17 视频理解串讲— MViT 论文精读

继TimeSformer模型之后,咱们再介绍两篇来自Facebook AI的论文,即Multiscale Vision Transformers以及改进版MViTv2: Improved Multiscale Vision Transformers for Classification and Detection。 由于本司大模型组最近组织阅读的论文较多,…

【iOS ARKit】同时开启前后摄像头BlendShapes

在上一节中已经了解了 iOS ARkit 进行BlendShapes的基本操作,这一小节继续实践同时开启前后摄像头进行人脸捕捉和世界追踪。 iOS设备配备了前后两个摄像头,在运行AR 应用时,需要选择使用哪个摄像头作为图像输人。最常见的AR 体验使用设备后置…

Java实现数字化社区网格管理系统 JAVA+Vue+SpringBoot+MySQL

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、开发背景四、系统展示五、核心源码5.1 查询企事业单位5.2 查询流动人口5.3 查询精准扶贫5.4 查询案件5.5 查询人口 六、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpringBootMySQL的数字化社区网格管理系统&#xf…

Istio-gateway

一. gateway 在 Kubernetes 环境中,Kubernetes Ingress用于配置需要在集群外部公开的服务。但是在 Istio 服务网格中,更好的方法是使用新的配置模型,即 Istio Gateway,Gateway 允许将 Istio 流量管理的功能应用于进入集群的流量&…

MongoDB日期存储与查询、@Query、嵌套字段查询实战总结

缘由 MongoDB数据库如下: 如上截图,使用MongoDB客户端工具DataGrip,在filter过滤框输入{ profiles.alias: 逆天子, profiles.channel: },即可实现昵称和渠道多个嵌套字段过滤查询。 现有业务需求:用Java代码来查询…

【代码随想录15】110.平衡二叉树 257. 二叉树的所有路径 404.左叶子之和

目录 110. 平衡二叉树题目描述参考代码 257. 二叉树的所有路径题目描述参考代码 404.左叶子之和题目描述参考代码 110. 平衡二叉树 题目描述 给定一个二叉树,判断它是否是高度平衡的二叉树。 本题中,一棵高度平衡二叉树定义为: 一个二叉树…

微信小程序(十四)分包和分包预加载

注释很详细,直接上代码 上一篇 新增内容: 1.分包的配置 2.分包预加载的写法 先说说为什么需要分包: 小程序追求小而快,主包的大小控制是小程序上线的硬性要求,分包有利于小程序优化加载速度 分包的注意事项&#xff1a…

JVM篇:垃圾回收

如何判断对象可以被回收 Java中对象能否被回收,是根据兑现是否被引用来决定的。如果对象被引用了,说明该对象还在使用,不允许被回收 main栈帧中demo变量存储着Demo实例对象的地址,与Demo实例对象建立了连接关系此时Demo实例对象可…

2024新版68套Axure RP大数据可视化大屏模板及通用组件+PSD源文件

Axure RP数据可视化大屏模板及通用组件库2024新版重新制作了这套新的数据可视化大屏模板及通用组件库V2版。新版本相比于V1版内容更加丰富和全面,但依然秉承“敏捷易用”的制作理念,这套作品也同样延续着我们对细节的完美追求,整个设计制作过…

关于binlog文件恢复数据库的方法

今天给大家讲解下,binlog日志恢复数据库的方法,之前由于数据库中了勒索病毒,这期文章告诉你恢复的方法:下面这种千万不要支付,支付了也不会给恢复 找到binlog文件: 这里我只恢复00032和00033即可&#xff1…

鸿蒙开发初体验

文章目录 前言一、环境配置1.1 安装DevEco Studio1.2 安装相关环境 二、工程创建三、工程结构介绍四、代码实现4.1 初识ArkTs4.2 具体实现 参考资料 前言 HarmonyOS是华为公司推出的一种操作系统,旨在为不同设备提供统一的操作系统和开发平台。鸿蒙开发的出现为用户…

【深度学习】sdxl中的 text_encoder text_encoder_2 区别

镜像问题是:https://editor.csdn.net/md/?articleId135867689 代码仓库: https://huggingface.co/stabilityai/stable-diffusion-xl-base-1.0/tree/main 截图: 为什么有两个CLIP编码器 text_encoder 和 text_encoder_2 ? 在…

照片怎么弄成jpg格式文件?jpg图片格式转换器介绍

jpg图片格式作为最常用的图片格式类型之一,不管是平时下载还是拍摄的照片大多数都属于jpg格式,还有我们在制作证件照照片时,通常需要将照片转换成jpg格式,以便更好地保存、打印或上传至网站等,那么图片转换为jpg需要怎…

day31_HTML

今日内容 0 复习昨日 1 表格标签 2 表单标签【重要】 3 框架标签 0 复习昨日 Javaweb开发,前端,服务器,数据库 前端,要学习HTML,CSS,JavaScript,JQuery HTML是用来编写网页的一种编程语言 语法 由各种标签组成,标签是尖括号<>,一般都是成对儿出现,前面叫做开标签,后面…

SpringBoot自定义全局异常处理器

文章目录 一、介绍二、实现1. 定义全局异常处理器2. 自定义异常类 三、使用四、疑问 一、介绍 Springboot框架提供两个注解帮助我们十分方便实现全局异常处理器以及自定义异常。 ControllerAdvice 或 RestControllerAdvice&#xff08;推荐&#xff09;ExceptionHandler 二、…

学习gin框架知识的注意点

这几天重新学习了一遍gin框架&#xff1a;收获颇多 Gin框架的初始化 有些项目中 初始化gin框架写的是&#xff1a; r : gin.New() r.Use(logger.GinLogger(), logger.GinRecovery(true)) 而不是r : gin.Default() 为什么呢&#xff1f; 点击进入Default源码发现其实他也是…

如何在有或没有备份的 iPhone 上检索已删除的短信

iPhone 清理垃圾短信时不小心删除了一些重要短信&#xff1f;想知道如何找回 iPhone 上已删除的短信吗&#xff1f;如果您已将设备备份到 iCloud 或 iTunes&#xff0c;则可以从备份恢复 iPhone 上的短信。如果没有备份&#xff0c;您可以尝试第三方iPhone短信恢复程序来恢复它…

记一个信息泄露到RCE

打点 开局一个登录框 信息收集 发现了一处接口泄露了部分信息 不过只有支付宝密钥的信息无法扩大危害&#xff0c;此时尝试寻找了一下其他同类型系统同样的接口&#xff0c;查看一下是否泄露的信息相同 因为如果相同就说明是静态的&#xff0c;没有价值横向收集 此时访问其他…

RabbitMQ概念

一 、RabbitMQ概念 1 架构图 2 相关概念 Publisher - ⽣产者&#xff1a;发布消息到RabbitMQ中的Exchange Consumer - 消费者&#xff1a;监听RabbitMQ中的Queue中的消息 Broker&#xff1a;接收和分发消息的应用&#xff0c;RabbitMQ Server就是 Message Broker&#xf…

力扣日记1.27-【回溯算法篇】131. 分割回文串

力扣日记&#xff1a;【回溯算法篇】131. 分割回文串 日期&#xff1a;2023.1.27 参考&#xff1a;代码随想录、力扣 131. 分割回文串 题目描述 难度&#xff1a;中等 给你一个字符串 s&#xff0c;请你将 s 分割成一些子串&#xff0c;使每个子串都是 回文串 。返回 s 所有可…