Linux——Shell编程之函数与数组

目录

引言

Shell 函数

1、函数的用法

2、函数示例学习

(1)两个数求和

 (2)系统资源监控并报警

3、函数变量的作用范围

4、函数的参数

 5、递归函数

Shell数组

示例.基本使用方法

(1)获取数组长度

(2)读取某下标赋值

(3)数组遍历

(4)数组切片

(5)数组替换

 

(6)数组删除

Shell脚本调试

 闲谈


引言

    时隔多日,我再一次以“人”的身份,继续编写自己的帖子。为什么?因为我成为了“俄罗斯轮盘赌”的“赌徒”,然而不幸中的万幸...抢救回来了!所以,为了让自己的思维逻辑逐步清晰,我又要开始长篇大论,误人子弟!

    主要还有一个重要原因:阿里云打电话询问我的未来打算。唉...别说,我原本都没什么打算。一切都是冲动?好像就是冲动... ...这也是我为什么去打台球的原因——磨练心性。确实是个机遇,老师点醒了我,客服提醒了我。一切都是恰到好处... ...或许...真的要考虑一下未来的打算了。

    就这样吧...随缘?或许吧。

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脚本中,数组是一种常见的数据结构,主要的应用场景包括:获取数据长度、获取元素长度、遍历元素、元素删除等等。常用的定义方法包括以下几种。

  1. 数组名=(value0 value1 value2 ...)
  2. 数组名=([0]=value [1]=value [2]=value ...)
  3. 列表名="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

 闲谈

    未来干些什么呢... ...不知道,也是时候去认真的想想了。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值