• 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
    
    *************** 当你发现自己的才华撑不起野心时,就请安静下来学习吧!***************
  • 相关阅读:
    HDU 3681 Prison Break 越狱(状压DP,变形)
    POJ 2411 Mondriaan's Dream (状压DP,骨牌覆盖,经典)
    ZOJ 3471 Most Powerful (状压DP,经典)
    POJ 2288 Islands and Bridges (状压DP,变形)
    HDU 3001 Travelling (状压DP,3进制)
    POJ 3311 Hie with the Pie (状压DP)
    POJ 1185 炮兵阵地 (状压DP,轮廓线DP)
    FZU 2204 7
    POJ 3254 Corn Fields (状压DP,轮廓线DP)
    ZOJ 3494 BCD Code (数位DP,AC自动机)
  • 原文地址:https://www.cnblogs.com/lvzhenjiang/p/14199030.html
Copyright © 2020-2023  润新知