目录
引言
时隔多日,我再一次以“人”的身份,继续编写自己的帖子。为什么?因为我成为了“俄罗斯轮盘赌”的“赌徒”,然而不幸中的万幸...抢救回来了!所以,为了让自己的思维逻辑逐步清晰,我又要开始长篇大论,误人子弟!
主要还有一个重要原因:阿里云打电话询问我的未来打算。唉...别说,我原本都没什么打算。一切都是冲动?好像就是冲动... ...这也是我为什么去打台球的原因——磨练心性。确实是个机遇,老师点醒了我,客服提醒了我。一切都是恰到好处... ...或许...真的要考虑一下未来的打算了。
就这样吧...随缘?或许吧。
Shell 函数
没错,今天将由我本人操手编写大部分内容!我会尽可能的为大家清晰的讲解知识与相关命令步骤的。如果你对于这些完全是零基础的话,这些可能可以帮助到您。(如果你真的是第一次接触IT知识...或许这个专栏能帮你初步了解。)-----→基本编程&条件语句&循环语句。
1、函数的用法
在Shell脚本执行的过程中,函数被置于内存中,每次调用函数无需从硬盘读取,故运行速度较快。然而函数并非是必须的元素,但函数可以对程序进行更好的组织。它可以令相对独立的代码变成函数,可以提高程序可读性与重用性,避免编写大量重复代码。定义方法如下:
[function] 函数名(){ 命令序列 [return x] }
- “function”:关键字表示定义一个函数,可以省略;
- “{”符号:表示函数执行命令的入口,该符号可以与函数名同行也可以在函数名在下一行的句首;
- “}”符号:表示函数体结束,两个大括号之间{ }是函数体;
- “命令序列”:可以是任意shell命令(基本编程),也可以调用其他函数;
- “return”:表示退出函数返回一个退出值,通过返回值判定执行是否成功,也可以使用exit终止整个Shell脚本。
扩展:如果while语句陷入无限循环,可以使用break语句直接暂停语句循环,也可使用continue语句直接跳到下一个函数进行循环。
2、函数示例学习
(1)两个数求和
使用Shell脚本实现两个数相加求和,我们可以定义函数的方式来完成。sum函数内部通过read命令接收用户分别输入的两个数,然后做加法运算,最后通过调用函数的方式来输入两个数的和。命令如下:
[root@localhost ~]#vim sum.sh
#!/bin/bash //定义操作环境
#定义sum函数
sum() {
echo "请输入第一个数:"
read num1
#检查输入是否为有效的数字
if ! [[ $num1 =~ ^[0-9]+$ ]];
then
echo "输入的第一个数不是有效的整数,请重新运行脚本并输入正确的数字。"
return 1
fi
echo "请输入第二个数:"
read num2
# 检查输入是否为有效的数字
if ! [[ $num2 =~[0-9]+$ ]];
then
echo"输入的第二个数不是有效的整数,请重新运行脚本并输入正确的数字。"
return 1
fi
#计算两数之和
result=$((num1 + num2))
#输出结果
echo "两数之和为:$result"
}
#调用sum函数
sum
[root@localhost ~]#chmod +x sum.sh
[root@localhost ~]#./sum.sh
请输入第一个数:4786
请输入第二个数:1439
“你输入的两个数为:4786 和 1439.”
“两个数的和为:6225”
(2)系统资源监控并报警
该函数会定期监控系统的CPU和内存使用率,当使用率超过设定的阈值时,就会发送报警信息提醒,这里将简单模拟实验环境,实际的应用中还会扩展为发送邮件、短信等。命令如下:
[root@localhost ~]#vim CPU&MEM_jiankong.sh
#!/bin/bash //指定系统环境
#发送报警信息的函数
send_alert() {
local message=$1
echo "ALERT:$message"
#这里可以添加发送邮件、短信等报警逻辑
}
#系统资源监控函数
monitor_system_resources() {
local cpu_threshold=$1
local men_threshold=$2
local interval=$3
while true; do
#获取CPU使用率
cpu_usage=$(top -bn1 | grep "Cpu(s)" | awk '{print $2 + $4}')
#获取内存使用率
mem_usage=$(free | awk `/Mem/ {printf("%.2f",$3/$2 * 100)}`)
if (( $(echo "$cpu_usage > $cpu_threshold" | bc -l) ));
then
send_alert "CPU usage ($cpu_usage%)."
fi
if (( $(echo "$mem_usage > $mem_threshold" | bc -l) ));
then
send_alert "Memory usage ($mem_usage%)."
fi
done
}
#调用函数
monitor_system_resources 5 1 5
- 参数说明:函数接收三个参数,分别是CPU使用率阈值、内存使用率阈值以及监控间隔时间(秒)。
- 循环监控:使用 while true循环不断监控系统资源。通过top和free命令获取CPU和内存使用率,使用bc命令进行浮点数比较。
- 报警处理:当使用率超过阈值时,调用send_alert函数发送报警信息。
3、函数变量的作用范围
再编写运行脚本时,有时需要将变量的值限定在函数内部,可以通过内置命令 local来实现。函数内部的变量的使用,可以避免函数内外同时出现同名变量对脚本的结果影响。命令如下:
[root@localhost ~]#vim lemon_scope.sh
mylemon ()
{
local i
i=10
echo $i
}
i=20
mylemon
echo $i
[root@localhost ~]#chmod +x lemon_scope.sh
[root@localhost ~]#./lemon_scope.sh
10
20
上述脚本里,函数内部通过local命令设置变量 i ,其作用就是将变量 i 限定在函数内部。故内部变量与全局变量互不影响。
4、函数的参数
用法如下:
函数名称 参数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 ${outfiel} "second line content."
[root@localhost ~]#chmod +x write_log.sh
[root@localhost ~]#./write_log.sh
[root@localhost ~]#cat /data/my.log
first line content. second line content.
上述脚本接收两个参数,第一个参数是写日志的目标文件,第二个参数是日志信息,整个脚本实现将日志信息写入目标文件内的目的。
5、递归函数
其实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
#如果是目录,递归调用函数继续遍历
ehco "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
函数 list_files的第一个参数是列举的目录名,第二个参数是调整的空间。
Shell数组
在Shell脚本中,数组是一种常见的数据结构,主要的应用场景包括:获取数据长度、获取元素长度、遍历元素、元素删除等等。常用的定义方法包括以下几种。
- 数组名=(value0 value1 value2 ...)
- 数组名=([0]=value [1]=value [2]=value ...)
- 列表名="value0 value1 value2 ..." 数组名=($列表名)
...
示例.基本使用方法
(1)获取数组长度
[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
(2)读取某下标赋值
[root@localhost ~]#arr_index2=${arr_numnber[2]}
//第三个元素
[root@localhost ~]#echo $arr_index2
3
(3)数组遍历
[root@localhost ~]#vim array_traverse.sh
#!/bin/bash
arr_number=(1 2 3 4 5)
for v in ${arr_number[@]}
do
echo $v
done
[root@localhost ~]#chomd +x array_traverse.sh
[root@localhost ~]#./array_traverse.sh
1
2
3
4
5
(4)数组切片
[root@localhost ~]#arr=(1 2 3 4 5)
[root@localhost ~]#echo ${arr[@]}
1 2 3 4 5
[root@localhost ~]#echo ${arr[@]:0:2} //${数组名[@或*]:起始位置:长度}
1 2
[root@localhost ~]#echo ${arr[@]:2:3}
3 4 5
ps:将数组切片后,返回的是字符串,以空格作为分隔符
(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
(6)数组删除
[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脚本开发中,经常会碰到各种各样的问题,例如忘记末尾处“fi”结束,又或是使用中文格式的符号进行编写。
所以为了避免自己编写的脚本出错,除了在编写脚本时注意书写规范,排除语法错误,更重要的是利用调试脚本工具来调试脚本。echo命令是最有用的调试脚本工具之一,一般在可能出现问题的脚本中加入echo命令,采用的是分段排查的方式。
其实除了echo命令之外,bash Shell也有相应参数可以调试脚本。使用bash命令参数调试,命令的语法为:
sh [-nvx] 脚本名
- -n:不会执行该脚本,仅查询脚本语法是否有问题,如果没有语法问题就不显示任何内容,如果有问题会提示报错。
- -v:在执行脚本时,先将脚本的内容输出到屏幕上然后执行脚本,如果有错误,也会给出错误提示。
- -x:将执行的脚本内容输出到屏幕上,这个是对调试很有用的参数。
示例如下:
[root@localhost ~]#vim BashShell.sh
#!/bin/bash
set -x //开启调试模式
read -p "请输入您的分数(0-100):" GRADE
if [ $GRADE -ge 85 ] && [ $GRADE -le 100 ]
then
echo "$GRADE 分!我丢,你好优秀" set +x //关闭调试模式
elif [ $GRADE -ge 70 ] && [ $GRADE -le 84 ]
then
echo "$GRADE 分,一般般,及格"
else
echo “$GRADE 分?算了吧,洗洗睡吧。”
fi
闲谈
未来干些什么呢... ...不知道,也是时候去认真的想想了。
413

被折叠的 条评论
为什么被折叠?



