一:Shell函数
1.函数的用法
Shell函数可用于存放一系列的指令。在Shel1脚本执行的过程中,函数被置于内存中,每次调用函数时不需要从硬盘读取,因此运行的速度比较快。在She11编程中函数并非是必须的元素,但使用函数可以对程序进行更好的组织。将一些相对独立的代码变成函数,可以提高程序可读性与重用性,避免编写大量重复代码。
Shell 函数定义的方法如下所示:
[function] 函数名(){
命令序列
[return x]}
- “function”关键字表示定义一个函数,可以省略;
- “{”符号表示函数执行命令的入口,该符号可以与函数名同行也可以在函数名下一行的句首:
- “}”符号表示函数体结束,两个大括号之间{}是函数体;
- “命令序列”部分可以是任意的 Shell 命令,也可以调用其他函数;
- “return”表示退出函数返回一个退出值,通过返回值判断执行是否成功,也可以使用exit终止整个 Shell脚本。
(1)两个数求和
(2)系统资源监控并报警函数
该函数会定期监控系统的CPU和内存使用率,当使用率超过设定的值时,会发送报警信息,这里简单模拟为输出到控制台,实际应用中可扩展为发送邮件、短信等。
- 参数说明:函数接收三个参数,分别是CPU使用率值、内存使用值以及监控间隔时间(秒)。
- 循环监控:使用whiletrue循环不断监控系统资源。通过top和free命令获取CPU 和内存使用率,使用bc命令进行浮点数比较。
- 报警处理:当使用率超过阈值时,调用sendalert函数发送报警信息。
2.函数变量的作用范围
在she11脚本中函数的执行并不会开启一个新的子she1l,而是仅在当前定义的Shel1环境中有效。如果She11脚本中的变量没有经过特殊设定,默认在整个脚本中都是有效的。
在编写脚本时,有时需要将变量的值限定在函数内部,可以通过内置命令ocal来实现。函数内部变量的使用,可以避免函数内外同时出现同名变量对脚本结果的影响。1ocal命令的使用如下所示。
3.函数的参数
函数的参数的用法如下。
函数名称参数1 参数2 参数3 .....
在使用函数参数时,函数名称在前参数在后,函数名和参数之间用空格分隔,可以有多个参数,参数使用$1、$2、$3..的方式表示。以此类推,从第10 个参数开始,调用方法为${18},不加大括号无法调用成功。下面是函数参数的一个简单应用。
4.递归函数
She11也可以实现递归函数,就是可以调用自己本身的函数。在Linux系统上编写she11 脚本的时候,经常需要递归遍历系统的目录,列出目录下的文件和目录,逐层递归列出,并对这些层级关系进行展示。具体的实现过程如下所示。
二:Shell数组
在She11脚本中,数组是一种常见的数据结构,主要的应用场景包括:获取数组长度、获取元素长度、遍历元素、元素切片、元素替换、元索删除等等。She1l中的数组与Java、C、Python 不同,只有一维数组,没有二维数组。数组元素的大小与限制,也不需要事先定义。She11数组用括号()来表示,元素用空格分隔,元素的下标与大部分编程语言类似从0开始。
数组常用定义方法包括以下几种。
方法一:
数组名=(valuee value1 value2...)
方法二:
数组名-([0]-value [1]-value [2]-value ...)
方法三:
列表名=”value0 value1 value2..”数组名-($列表名)
方法四:
数组名[0]=”value"数组名[1]-”value”数组名[2]-”value”
......
1.获取数组长度
在She11编程中,数组是一种用于存储多个值的数据结构。获取数组长度(即教组中元素的个数)在很多场景下都非常有用,比如进行数组遍历、数据处理等。普通数组是She11中最常见的数组类型,其下标是从0开始的连续整数。获取普通数组长度可以使用$(#数组名[@]}或#数组名[]}这两种语法,它们的效果是一样的。
[root@localhost ~l#t arr number-(1 2 3 4 5)
[root@localhost wl# arr length=${#arr number[*]}
[root@localhost ml# echo $arr length
5
[root@localhost l# arr_length_1-${#arr_number[@]}
[root@localhost ~]# echo $arr.length_15
2.读取某下标赋值
在she11编程里,你可以读取数组中指定下标的元素,也可以给指定下标的数组元素赋值。普通数组是She11中最常用的数组类型,其下标是从开始的整数。
[root@localhost ~]# arr index2=${arr_number[2]}
//第三个元素
[root@localhost ~]# echo $arr index23
3.数组遍历
在Shell编程里,数组遍历指的是按顺序访问数组中的每一个元素,并对这些元素执行特定操作的过程。
这在处理一组相关数据时非常有用,比如批量处理文件、统计数据等。
[root@localhost # vimarray traverse.sh
#!/bin/bash
arr number=(12345)
for v in ${arr_number[@]}
do
echo $v
done
[root@localhost ~]# chmod +x array.traverse .sh[root@localhost ~]#/array_traverse.sh
1
2
3
4
5
4.数组切片
数组切片是一种操作,用于从数组中提取出一部分连续的元素,形成一个新的数组。这个操作在很多编程语言中都有支持,不过不同语言实现数组切片的语法和方式会有所差异。在Bash脚本里,也可以进行数组切片操作。语法是${array[@]:start:length),其中start是开始的索引,1ength是要提取的元素个数。
[root@localhost ~]# arr=(1 2 3 4 5)
[root@localhost l# echo ${arr[@]}
//输出整个数组
1 2 3 4 5
Iroot@localhost ~l# echo ${arr[@]:0:2}//${数组名[@或*]:起始位置:长度}
1 2
[root@localhost ~l# echo ${arr[@]:2:3}
3 4 5
将数组切片之后,返回的是字符串,以空格作为分隔符。
5.数组替换
[root@localhost w]# 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 .]# ar-($(amr[@]/4/66))
//要实现改变原有数组,可通过重新赋值实现
[root@localhost m# echo ${arr[@])
1 2 3 66 5
6.数组删除
[root@localhost ~]# arn=(1 2 3 4 5)
[root@localhost ~]# unset arr
//删除数组
[root@localhost ~]# echo ${arr[*]}[root@localhost ~]# anr=(1 2 3 4 5)[root@localhost ~]# unset arr[2]
//删除第三个元素
[root@localhost ~]# echo s{arn[*]}
1 2 4 5
三:Shell脚本调试
在she11脚本开发中,经常碰到一些规范方面的问题,例如忘了使用引号或在1f语句末尾处忘记加fi结束。要注意把复杂的脚本简单化,要思路清晰,并且分段实现。当执行脚本时出现错误后,不要只看那些提示的错误行,而是要观察整个相关的代码段。
为避免编写的脚本出错,除了在编写脚本时注意书写规范,排除语法错误,更重要的是利用调试脚本工具来调试脚本。echo命令是最有用的调试脚本工具之一,一般在可能出现问题的脚本中加入echo命令,采用的是分段排查的方式。
语法为:
除了 echo命令之外,bashshell也有相应参数可以试脚本。使用bash 命令参数调试,命令的语法为:
sh [-nvx] 脚本名
常用参数的具体含义为:
- -n;不会执行该脚本,仅查询脚本语法是否有问题,如果没有语法问题就不显示任何内容、如果有问题会提示报错。
- -V:在执行脚本时,先将脚本的内容输出到屏幕上然后执行脚本,如果有错误,也会给出错误提示。
- -x:将执行的脚本内容输出到屏幕上,这个是对调试很有用的参数。
当脚本文件较长时,可以使用set命令指定调试一段脚本。
[root@localhost ~]# vim test.sh
#!/bin/bash
set -x //开启调试模式
read-p"请输入您的分数(0-100):"GRADE
if [ $GRADE -ge 85 ] && [ $GRADE -e 100 ]then
echo "$GRADE 分!优秀” set+x //关闭调试模式elif [ $GRADE -ge 70 ] && [ $GRADE -le 84 ]
then
echo “$GRADE 分,合格" else
echo "$GRADE 分?不合格"fi
总结:
函数:函数是She11脚本中组织代码、提高复用性的重要手段。通过将一系列指令封装成函数,可以
避免代码重复,使脚本更加简洁易读。函数的定义与调用简单直观,支持参数传递和递归调用,为模块化开发提供了便利。
数组:作为She11脚本中的一种重要数据结构,数组支持存储多个值,并提供了丰富的操作方法,如获取数组长度、读取和赋值、遍历、切片、替换和删除元素等。这些功能在处理一组相关数据时非常有用。调试与测试:在 she11 脚本编写过程中,调试与测试是确保脚本正确运行的关键环节。通过使用 echo命令和 bash 的调试参数(-n、-v、-x),可以方便地定位和解决问题,提高脚本的稳健性。
总之,本章内容对于掌握she11 编程的核心技能至关重要,是编写高效、可维护she11 脚本的必备知识。