开发者

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

目录
  • 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.devze.com/ {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.devze.com[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

      总结

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

      0

      上一篇:

      下一篇:

      精彩评论

      暂无评论...
      验证码 换一张
      取 消

      最新运维

      运维排行榜