首页 > 技术文章 > Linux学习59 shell脚本高级用法-函数编程与应用实战

Presley-lpc 2020-03-30 20:56 原文

一、回顾:循环

  1、循环控制:break,continue

  2、while,for循环的特殊用法

  3、for (());do

    循环体

    done

  4、while read VARAIBLE;do

    循环体

    done < /PATH/FROM/SOMEFILE

二、bash脚本编程

  1、case语句

    a、多分支if语句:

      if CONDITION1;then

        分支1

      elif CONDITION2;then

        分支2

      ...

      else CONDITION;then

        分支n

      fi

    b、实例

      (1)实例1:显示一个菜单给用户

        cpu) display cpu infomation

        mem) display memory infomation

        disk) display disks infomation

        quit) quit

        要求:

          1)、提示用户给出自己的选择

          2)、正确的选择则给出相应的信息,否则,则提示重新选择正确的选项

   

  2、case语句的语法格式

    a、语法格式

      case $VARAIBLE in

      PAT1)

        分支1

        ;;

      PAT2)

        分支2

        ;;

      ...

      *)

        分支n

        ;;

      esac

    b、上述示例

    c、示例:写一个服务框架脚本

      $lockfile,值为/var/lock/subsys/SCRIPT_NAME

      (1)、脚本可接受start,stop,restart,status四个参数之一

      (2)、如果参数非此四者,则提示使用帮助后退出

      (3)、start,则创建lockfile,并显示启动;stop;则删除lockfile,并显示停止;restart,则先删除此文件再创建此文件,而后显示重启完成;status,如果lockfile存在则显示running,否则,则显示为stopped

        

        

        

  3、case总结

    a、case支持glob风格的通配符

      *:任意长度的任意字符

      ?:任意单个字符

      []:范围内任意单个字符

      a|b: a或b

三、函数:function

  1、过程式编程:代码重用

    a、模块化编程

    b、结构化编程

    c、把一段独立功能的代码当做一个整体,并为之取一个名字;命名的代码段,此即为函数

      注意:定义函数的代码段不会自动执行,在调用时执行;所谓调用函数,即在代码中给定函数名即可,函数名出现的任何位置,在代码执行时,都会被自动替换为函数代码

  2、定义函数

    a、语法一

      function f_name {

        ...函数体...

      }

    b、语法二

      f_name() {

        ...函数体...

      }

    c、函数的生命周期:每次被调用时创建,返回时终止

      (1)、其状态返回结果为函数体中运行的最后一条命令的状态结果

      (2)、自定义状态返回值,需要使用:return

        return[0-25]

        0:成功

        1-255:失败

  3、示例

    a、给定一个用户名,取得用户的id号和默认shell

      (1)、方式1

        

       (2)、方式2

        

       (3)、我们现在来重复使用

        

    b、重写前面的服务脚本框架

      

      

  4、函数返回值

    a、函数的执行结果返回值

      (1)、使用echo或printf命令进行输出

      (2)、函数体中调用的命令的执行结果

    b、函数的退出状态码

      (1)、默认取决于函数体中执行的最后一条命令的退出状态码

      (2)、自定义:return

  5、函数可以接受参数

    a、传递参数给函数

      (1)、在函数体当中,可以使用$1,$2,...引用传递给函数的参数,还可以在函数中使用$*或$@引用所有参数,$#引用传递的参数的个数

      (2)、在调用函数时,在函数名后面以空白符分隔给定参数列表即可,例如,testfunc arg1 arg2 arg3...

    b、实例

      (1)、添加10个用户,添加用户的功能使用函数实现,用户名作为参数传递给函数

        

  6、练习题

    a、使用函数实现ping一个主机来测试主机的在线状态,主机地址通过参数传递给函数

      主程序:测试172.16.1.1-172.16.67.1范围内各主机的在线状态

    b、写一个脚本,实现打印NN乘法表;

四、变量作用域

  1、局部变量:作用域是函数的生命周期;在函数结束时被自动销毁

    a、定义局部变量的方法:local VARIABLE=VALUE

  2、本地变量:作用域是运行脚本的shell进程的生命周期,因此,其作用范围为当前shell脚本程序文件

    a、实例1

      

      

     b、实例2

      

      

五、函数递归

  1、函数直接或间接调用自身

    a、经典场景

      

       

       

    b、菲薄拉些数列实现

      

      

      

      

      

      

      

 

推荐阅读