zoukankan      html  css  js  c++  java
  • shell之case语句与函数

    一、case语句

    1.1 语法结构

    case var in     定义变量;var代表是变量名
    pattern 1)      模式1;用 | 分割多个模式,相当于or
        command1     需要执行的语句
        ;;         两个分号代表命令结束
    pattern 2)
        command2
        ;;
    pattern 3)
        command3
        ;;
              *)       default,不满足以上模式,默认执行*)下面的语句
        command4
        ;;
    esac          esac表示case语句结束
    #pattern表示需要匹配的模式
    

    1.2 应用案例

    1)脚本传不同值做不同事

    ① 需求:
    当给程序传入start、stop、restart三个不同参数时分别执行相应命令!

    ② 实现:

    #!/bin/bash
    case $1 in 
    	start|S)
    		service httpd start &> /dev/null && echo "httpd 启动成功"
    	;;
    	stop|T)
    		service httpd stop &> /dev/null && echo "httpd 停止成功"
    	;;
    	restart|R)
    		service httpd restart &> /dev/null && echo "httpd 重启成功"
    	;;
    	*)
    		echo "请输入对应的值(start|stop|restart)……"	
    	;;
    esac
    
    2)根据用户需求选择做事

    ① 需求:
    脚本提示让用户输入需要管理的服务名,然后提示用户需要对服务做什么操作,如启动,关闭等操作!

    ② 实现:

    #!/bin/bash
    read -p "请输入你需要管理的服务名称(httpd|vsftpd):" service
    case $service in
    	vsftpd|ftp)
    	read -p "请选择需要执行的指令(start|stop|restart):" action1
    	case $action1 in 
    		start)
    			service vsftpd start &> /dev/null && echo "${service}服务已经启动成功"
    		;;
    		stop)
    			service vsftpd stop &> /dev/null && echo "${service}服务已经停止成功"
    		;;
    		restart)
    			service vsftpd restart &> /dev/null && echo "${service}服务已经重启成功"
    		;;
    	esac
    	;;
    	httpd|apache)
    	read -p "请选择需要执行的指令(start|stop|restart):" action2
    	case $action2 in 
    		start)
    			service httpd start &> /dev/null && echo "${service}服务已经启动成功"
    		;;
    		stop)
    			service httpd stop &> /dev/null && echo "${service}服务已经停止成功"
    		;;
    		restart)
    			service httpd restart &> /dev/null && echo "${service}服务已经重启成功"
    		;;
    	esac
    	;;
    esac
    
    3)菜单提示让用户选择需要做的事

    ① 需求:
    模拟一个多任务维护界面,当执行程序时先显示总菜单,然后进行选择后做相应的操作!如下:

    **********请选择*********
    h   显示命令帮助
    f   显示磁盘分区
    d   显示磁盘挂载
    m   查看内存使用
    u   查看系统负载
    q   退出程序
    *************************
    

    ② 实现:

    #!/bin/bash
    #打印菜单
    menu(){
    cat <<END
        h   显示命令帮助
        f   显示磁盘分区
        d   显示磁盘挂载
        m   查看内存使用
        u   查看系统负载
        q   退出程序
    END
    }
    menu
    while true
    do
    read -p "请输入你的操作[h for help]:" var1
    case $var1 in
        h)
        menu
        ;;
        f)
        read -p "请输入你要查看的设备名字[/dev/sdb]:" var2
        case $var2 in
            /dev/sda)
            fdisk -l /dev/sda
            ;;
            /dev/sdb)
            fdisk -l /dev/sdb
            ;;
        esac
        ;;
        d)
        lsblk
        ;;
        m)
        free -m
        ;;
        u)
        uptime
        ;;
        q)
        exit
        ;;
    esac
    done
    

    二、函数

    2.1 函数简介

    • shell中允许将一组命令集合或语句形成一段可用代码,这些代码成为shell函数;
    • 给这段代码起个名称成为函数名,后续可以直接调用这段代码的功能;

    2.2 定义函数

    1)方法一
    函数名()
    {
      函数体(一堆命令的集合,来实现某个功能)   
    }
    
    2)方法二
    function 函数名()
    {
       函数体(一堆命令的集合,来实现某个功能)
       echo hello
       echo world
    }
    

    函数中return说明:
    1)return可以结束一个函数。类似于循环控制语句break结束当前循环。执行循环体后的代码;
    2)return默认返回函数中最后一个命令状态值,也可给定参数值,范围是0~256之间;
    3)如果没有return命令,函数将返回最后一个指定的退出状态值;

    2.3 调用函数

    1)当前命令行调用
    $ vim 1.sh 
    #!/bin/bash
    hello(){
    echo “hello lzj $1”
    hostname
    }
    menu(){
    cat <<-EOF
    1.mysql
    2.web
    3.app
    4.exit
    EOF
    }
    $ source 1.sh
    $ hello 888
    “hello lzj 888”
    localhost.localdomain
    $ menu
    1.mysql
    2.web
    3.app
    4.exit
    
    2)定义到用户的环境变量中
    $ vim ~/.bashrc
    文件中增加如下内容:
    hello(){
    echo "hello lzj $1"
    hostname
    }
    menu(){
    cat <<-EOF
    1. mysql
    2. web
    3. app
    4. exit
    EOF
    }
    
    注意:当用户打开bash的时候会读取该文件
    
    3)脚本中调用
    $ vim 2.sh
    #!/bin/bash
    #打印菜单
    source ./1.sh
    menu(){
    cat <<-EOF
            h       显示帮助
            f       显示磁盘分区
            d       显示磁盘挂载
            m       查看内存使用
            u       查看系统负载
            q       退出程序
            EOF
    }
    menu
    $ sh 2.sh 
    h	显示帮助
    f	显示磁盘分区
    d	显示磁盘挂载
    m	查看内存使用
    u	查看系统负载
    q	退出程序
    
    4)应用示例

    ① 需求:
    1)写一个脚本收集用户输入的基本信息(姓名、性别、年龄)。如果不输入,一直提示输入;
    2)最后根据用户的信息输出相对应的内容;

    ② 实现:

    #!/bin/bash
    #该函数实现用户如果不输入内容则一直循环知道用户输入位置,并且将用户输入的内容打印出来
    input_fun(){
      input_var=""
      output_var=$1
      while [ -z $input_var ]
      do
        read -p "$output_var" input_var
      done
      echo $input_var
    }
    #调用函数并且获取用户的姓名、性别、年龄分别负责赋值给name、sex、age
    name=$(input_fun 请输入您的姓名:)
    sex=$(input_fun 请输入您的性别:)
    age=$(input_fun 请输入您的年龄:)
    #根据用户输入的性别进行匹配判断
    case $sex in
      man)
      if [ $age -gt 18 -a $age -le 35 ];then
        echo "年轻有为!加油"
      elif [ $age -gt 35 ];then
        echo "有点老了"
      else
        echo "太小了!"
      fi
      ;;
      woman)
        echo "小姐姐"
      ;;
    esac
    
    *************** 当你发现自己的才华撑不起野心时,就请安静下来学习吧!***************
  • 相关阅读:
    如何安装一个高可用K3s集群?
    如何设置一个生产级别的高可用etcd集群
    从架构到部署,全面了解K3s
    这应该是最适合国内用户的K3s HA方案
    在K3s上使用Kong网关插件,开启K3s的无限可能!
    AngularJS 遗留项目的升级改造之路(一)
    Rancher首席架构师解读Fleet:它何以管理百万集群?
    资深首席架构师预测:2021年云计算的8个首要趋势
    简单4步,利用Prometheus Operator实现自定义指标监控
    当年,我的架构师之路差点完蛋,幸亏了它
  • 原文地址:https://www.cnblogs.com/lvzhenjiang/p/14199030.html
Copyright © 2011-2022 走看看