shell编程之函数与数组的使用详解

2025-04-16 04:50

本文主要是介绍shell编程之函数与数组的使用详解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《shell编程之函数与数组的使用详解》:本文主要介绍shell编程之函数与数组的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教...

shell函数

函数的用法

Shell函数可用于存放一系列的指令。

在Shell脚本执行的过过程中,函数被置于内存中,每次调用函数时不需要从硬盘读取,因此运行的速度比较快。

在Shell编程中函数并非是必须的元素,但使用函数可以对程序进行更好的组织。

将一些相对独立的代码变成函数女,可以提高程序可读性与重用性,避免编写大量重复代码。

Shell函数定义的方法如下所示:

[function]函数名() {
命令序列
[return x]
}
  • "function"关键字表示定义一个函数,可以省略;
  • "{"符号表示函数执行命令的入口,该符号可以与函数名同行t也可以在函数名下一行的句首;
  • "}"符号表示函数体结束,两个大括号之间{}是函数体;
  • "命令序列"部分可以是任意的Shell命令,也可以调用其他函数
  • "return"表示退出函数返回一个退出值,通过返回值判断执行是否成功,也可以使用exit终止整个Shell脚本。

俩个数求和

使用Shell脚本实现两个数相加求和,通过定义函数的方式来完成。

sum函数内部通过read命接收用户分别输入的两个数,然后做加法运算,最后通过调用函数的方式来输出两个数的和。

[root@localhost ~]# vim sum. sh
#!/bin/bash
sum() {
echo"请输入第一个数:"
read num1
if![[[$num1 =~ ^[0-9]+$ ]];
then
echo"输入的第一个数不是有效的整数,请重新运行脚本并输入正确的数字。"
return 1
fi
echo"请输入第二个数:"
read num2echo"输入的第一个数不是有效的整数,请重新运行脚本并输入正确的数字。"
return 1
fi
echo"请输入第二个数:"
read num2
if![[[ $num2 =~ ^[0-9]+$ ]]; 
then
echo"输入的第二个数不是有效的整数,请重新运行脚本并输入正确的数字。"
return 1
fi
result=$((num1 + num2))
echo"两数之和为:$result"
sum
[root@localhost ~]# chmod +x sum.sh
[root@localhost ~]# ./sum.sh
请输入第一个数:2
请输入第二个数:3
js"你输入的两个数为:2和3."
"两个数的和为:5"

系统资源监控并报警函数

该函数会定期监控系统的CPU和内存使用率,当使用率超过设定的阈直时,会发送报警信息,这里简单模拟为输出到控制台,实际应用中可扩展为发送邮件、短信等。

[root@localhost ~]# vim jiankong.sh
#!/bin/bash
#发送报警信息的函数
send alert() {
local message=$1
echo "ALERT: $message"
}

monitor_system_resources() {
local cpu_threshold=$1
local mem_threshold=$2
local interval=$3

while true;
do
cpu_usage=$(top -bn1 | grep "Cpu(s)" | awk '{print$2+$4}')
mem_usage=$(free | awk '/Memhttp://www.chinasem.cn/ {printf("%.2f",$3/$2 * 1((00)}.
if(( $(echo "$cpu_usage > $cpu_threshold" | bc -1) ));
then
   send_alert "CPU usage ($cpu_usage%)."
fi
if(( $(echo "$mem_usage > $mem_threshold" | bc-1) )); then
send_alert "Memory usage ($mem_usage%)."
fi
sleep "$interval"
done
}
monitor_system_resources 5 1 5
  • 参数说明:函数接收三个参数,分别是CPU使用率阈值、内存使用率阈值以及监控间隔时间(秒)。
  • 循环监控:使用whiletrue循环不断监控系统资源。通过 top和free命令获取CPU和内存使用率,使用bc命令进行浮点数比较。
  • 报警处理:当使用率超过阈值时,调用send_alert函数发送报警信息。

函数变量的作用范围

在编写脚本时,有时需要将变量的值限定在函数内部,可以通过内置命令local来实现。函数内部变量的使用,可以避免函数内外同时出现同名变量对脚本结果的影响。

[root@localhost ~]# vim fun_scope.sh
myfun ()
{
local i
i=8
echo $i
}
i=9
myfun
echo $i
[root@localhost ~]# chmod +x fun_scope.sh
[root@localhost ~]# ./fun_scope.sh
8
9

函数的参数

函数的参数的用法如下。

函数名称 参数1 参数2 参数3.

在使用函数参数时,函数名称在前参数在后,函数名和参数之间用空格分隔,可以有多个参数,参数使用$1,$2,$3....的方式表达。

[root@localhost ~]# vim write_log.sh
#!/bin/bash
mydir="/data" outfile="${mydir}/my.log"
[ -e "${mydir}" ] | mkdir -p ${mydir}
appendfile()
{
echo "$2" >> "$1"
}
appendfile ${outfile} "first line content."
appendfile ${outfile} "second line content."
[root@localhost ~]# chmod +x write_log.sh
[root@localhost ~]# ./write_log.sh
[root@localhost ~]# cat /data/my.log
firstline content. second line content.

递归函数

Shell也可以实现递归函数,就是可以调用自己本身的函数。

linux系统上编写Shell脚本的时候,经常需要递归遍历系统的目录,列出目录下的文件和和目录,逐层递归列出,并对这些层级关系进行展示。

[root@localhost ~]# vim fun_recursion.sh
#!/bin/bash
traverse_directory() {
local dir=$1
for item in "$dir"/*; 
do
if [ -d "$item" ]; 
then
echo "Directory: $item"
traverse_directory "$item"
elif [ -f "$item" ];
 then
echo "File: $item"
fi
done
}

traverse_directory "."
[root@localhost ~]# chmod +x fun_recursion.sh
[root@localhost ~]# ./fun_recursion.sh

shell数组

在Shell脚本中,数组是一种常见的数据结构,Shell中的数组与Java、C、python不同,只有维数组,没有二维数组。

数组元素的大小与限制,也不需要事先定义。

Shell数组用括号()来表示,元素用空格分隔,元素的下标与大部分编程语言类似从0开始.

  • 方法一:

数组名=(value0value1value2...

  • 方法二:

数组名=([0]=value [1]=value [2]=value...)

  • 方法三:

列表名="valueevalue1value2."数组名=($列表名)

  • 方法四:

数组名[0]="value"数组名[1]="value"数组名[2]="value

获取数组的长度

获取普通数组长度可以使用${#数组名[@]}或${#数组名[*]}这两种语法效果一样。

[root@localhost ~]# arr_number=(1 2 3 4 5)
[root@localhost ~]# arr_length=${#arr_number[*]}
[root@localhost ~]# echo $arr_length
5
[root@localhost ~]# arr_length_1=${#arr_number[@] 
[root@localhost ~]# echo $arr_length_1
5

读取某下的标赋值

在Shell编程里,你可以读取数组中指定下标的元素,也可以给指定下标的数组元素赋值。

[root@localhost ~]# arr_index2=${arr_number[2]}
[root@localhost ~]# echo $arr_index2

数组遍历

在Shell编程里,数组遍历指的是按顺序访问php数组中的每一个元素,并对这些元素执行特定操作的过程。

[root@localhost ~]# vim array_traverse.sh
#!/bin/bash
arr_number=(1 2 3 4 5)
for i in ${arr_number[@]}
do
echo $i
done
[root@localhost ~]# chmod +x array_traverse.sh
www.chinasem.cn[root@localhost ~]# ./array_traverse.sh
1
2
3
4
5

数组切片

数组切片是一种操作,用于从数组中提取出一部分连续的元NBSSqGyR素,形成一个新的数组,此存操作在不同的版本种存在差异。

[root@localhost ~]# arr=(1 2 3 4 5)
[root@localhost ~]# echo ${arr[@]}
12345
[root@localhost ~]# echo ${arr[@]:0:2}
1 2
[root@localhost ~]# echo ${arr[@]:2:3}
3 4 5

数组替换

[root@localhost ~]# arr=(1 2 3 4 5)
[root@localhost ~]# echo ${arr[@]/4/66}
1 2 3 66 5
[root@localhost ~]# echo ${arr[@]}
1 2 3 4 5
[root@localhost ~]# arr=(${arr[@]/4/66})
[root@localhost ~]# echo ${arr[@]}
1 2 3 66 5

数组删除

  • 删除数组
[root@localhost ~]# arr=(1 2 3 4 5)
[root@localhost ~]# unset arr
  • 删除单个元素
[root@localhost ~]# echo ${arr[*]}
[root@localhost ~]# arr=(1 2 3 4 5)
[root@localhost ~]# unset arr[2]
[root@localhost ~]# echo ${arr[*]}
1 2 4 5

shell脚步调试

在shell脚本开发中,要注意把复杂的脚本简单化,思路要清晰,分段。

除echo外,bash shell亦有相应的参数可以调试脚本。

使用bash参数调试,语法为:

sh [-nvx] 脚本名

  • -n:不会执行该脚本,仅查询脚本语法是否有问题,如果没有语法问题就不显示任何内容,如果有问题会提示报错。
  • -V:在执行脚本时,先将脚本的内容输出到屏幕上然后执行脚本,如果有错误,也会给出错误提
  • -x:将执行的脚本内容输出到屏幕上,这个是对调试很有用的参数。
[root@localhost ~
vim test.sh
#!/bin/bash
set-x/
read-p"请输入您的分数(0-100):"GRADE
if[$GRADE -ge 85 ] && [ $GRADE -le 100 ]
then
echo"$GRADE分!优秀"
elif [ $GRADE -ge 70 ] & [ $GRADE -1e 84 ]
then
echo"$GRADE分,合格"else
echo"$GRADE分?不合格"
fi
set +x

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持China编程(www.chinasem.cn)。

这篇关于shell编程之函数与数组的使用详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1154241

相关文章

使用Python和Pyecharts创建交互式地图

《使用Python和Pyecharts创建交互式地图》在数据可视化领域,创建交互式地图是一种强大的方式,可以使受众能够以引人入胜且信息丰富的方式探索地理数据,下面我们看看如何使用Python和Pyec... 目录简介Pyecharts 简介创建上海地图代码说明运行结果总结简介在数据可视化领域,创建交互式地

Java Stream流使用案例深入详解

《JavaStream流使用案例深入详解》:本文主要介绍JavaStream流使用案例详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录前言1. Lambda1.1 语法1.2 没参数只有一条语句或者多条语句1.3 一个参数只有一条语句或者多

Java Spring 中 @PostConstruct 注解使用原理及常见场景

《JavaSpring中@PostConstruct注解使用原理及常见场景》在JavaSpring中,@PostConstruct注解是一个非常实用的功能,它允许开发者在Spring容器完全初... 目录一、@PostConstruct 注解概述二、@PostConstruct 注解的基本使用2.1 基本代

C#使用StackExchange.Redis实现分布式锁的两种方式介绍

《C#使用StackExchange.Redis实现分布式锁的两种方式介绍》分布式锁在集群的架构中发挥着重要的作用,:本文主要介绍C#使用StackExchange.Redis实现分布式锁的... 目录自定义分布式锁获取锁释放锁自动续期StackExchange.Redis分布式锁获取锁释放锁自动续期分布式

springboot使用Scheduling实现动态增删启停定时任务教程

《springboot使用Scheduling实现动态增删启停定时任务教程》:本文主要介绍springboot使用Scheduling实现动态增删启停定时任务教程,具有很好的参考价值,希望对大家有... 目录1、配置定时任务需要的线程池2、创建ScheduledFuture的包装类3、注册定时任务,增加、删

SpringBoot整合mybatisPlus实现批量插入并获取ID详解

《SpringBoot整合mybatisPlus实现批量插入并获取ID详解》这篇文章主要为大家详细介绍了SpringBoot如何整合mybatisPlus实现批量插入并获取ID,文中的示例代码讲解详细... 目录【1】saveBATch(一万条数据总耗时:2478ms)【2】集合方式foreach(一万条数

使用Python实现矢量路径的压缩、解压与可视化

《使用Python实现矢量路径的压缩、解压与可视化》在图形设计和Web开发中,矢量路径数据的高效存储与传输至关重要,本文将通过一个Python示例,展示如何将复杂的矢量路径命令序列压缩为JSON格式,... 目录引言核心功能概述1. 路径命令解析2. 路径数据压缩3. 路径数据解压4. 可视化代码实现详解1

Pandas透视表(Pivot Table)的具体使用

《Pandas透视表(PivotTable)的具体使用》透视表用于在数据分析和处理过程中进行数据重塑和汇总,本文就来介绍一下Pandas透视表(PivotTable)的具体使用,感兴趣的可以了解一下... 目录前言什么是透视表?使用步骤1. 引入必要的库2. 读取数据3. 创建透视表4. 查看透视表总结前言

Python装饰器之类装饰器详解

《Python装饰器之类装饰器详解》本文将详细介绍Python中类装饰器的概念、使用方法以及应用场景,并通过一个综合详细的例子展示如何使用类装饰器,希望对大家有所帮助,如有错误或未考虑完全的地方,望不... 目录1. 引言2. 装饰器的基本概念2.1. 函数装饰器复习2.2 类装饰器的定义和使用3. 类装饰

Python 交互式可视化的利器Bokeh的使用

《Python交互式可视化的利器Bokeh的使用》Bokeh是一个专注于Web端交互式数据可视化的Python库,本文主要介绍了Python交互式可视化的利器Bokeh的使用,具有一定的参考价值,感... 目录1. Bokeh 简介1.1 为什么选择 Bokeh1.2 安装与环境配置2. Bokeh 基础2