zoukankan      html  css  js  c++  java
  • linux运维、架构之路-shell编程(二)

    一、流程控制语句

    1、if语句

    ①if单分支:一个条件一个结果

    if 条件
      then
         命令
    fi

    ②if双分支:一个条件两个结果

    if 条件
      then
        命令
    else
       命令2
    fi

    ③if多分支:多个条件多个结果

    if 条件
      then
        命令
    elif 条件2
      then
        命令2
    elif 条件3
      then
        命令3
    ……	
    else
       命令4
    fi
    

    #企业面试题001#

    开发检测系统内存监控脚本,如果低于800M,邮件报警,并且定时任务每三分钟执行一次检测

    cat check_mem.sh
    #!/bin/sh
    Mem=`free -m|awk 'NR==3{print $NF}'`
    if [ "$Mem" -lt "800" ]
      then
        echo $Mem|mail -s "系统内存低于800M" 774181401@qq.com
    fi

    #企业面试题002#

    模拟启动nginx脚本,使用if语句判断输入的是否为start、stop、restart……

    #!/bin/sh
    . /etc/init.d/functions
    Nginx_Start="/application/nginx/sbin/nginx"
    Nginx_stop="${Nginx_Start} -s stop"
    if [ "$1" == "start" ]
      then
        ${Nginx_Start}
        action "starting Nginx" /bin/true
    elif [ "$1" == "stop" ]
      then
        ${Nginx_stop}
        pkill nginx
        action "Nginx is stopped" /bin/true
    elif [ "$1" == "restart" ]
      then
        ${Nginx_stop} && ${Nginx_Start}
       action "Nginx is restarting" /bin/true
    elif [ "$1" != "start" -a "$1" != "stop" -a "$1" != "restart" ]
      echo "USAGE: $0 {start|stop|restart}"
    fi

    2、case语句

    ①语法

    case $x in 
    	值1)
    	   命令1
    	   ;;
    	值2)
    	   命令2
    	   ;;
    	值3)
    	   命令3
    	   ;;
    	*)
    	   命令4
    esac

    ②case语句相当于多分支if语句,适合变量少,且为固定数字或者字符串集合,多用于系统启动脚本

    #case实战菜单小题#

    #!/bin/bash
    cat<<EOF
    1. install rsync
    2. install nfs
    3. install mysql
    4. install all
    5. exit
    EOF
    read -p '请输入你的选择:' num
    
    case $num in
      1)
       echo "install rsync suscess!"
       ;;
      2)
       echo "install nfs suscess!"
       ;;
      3)
       echo "install mysql suscess!"
       ;;
      4)
       echo "install all suscess!"
       ;;
      5)
       exit
       ;;
      *)
        echo "选择有误"
    esac

    #case结合while实战水果菜单选择#

    #!/bin/sh
    RED='E[1;31m'
    GREEN='E[1;32m'
    YELLOW='E[1;33m'
    RES='E[0m'
    
    cat <<EOF
    ==================
    1.apple
    2.pear
    3.banana
    4.exit
    ==================
    EOF
    while true
    do
    read -p "请输入你喜欢吃的水果:" choice
    case $choice in
      1)
        echo -e "你喜欢的水果是: $RED apple $RES"
        ;;
      2)
        echo -e "你喜欢的水果是: $GREEN pear $RES"
        ;;
      3)
        echo -e "你喜欢的水果是:$YELLOW banana $RES"
        ;;
      4)
        exit
        ;;
      *)
        echo "输入有误"
    esac
    done

    #给输出字体加颜色#

    前景颜色:
    echo -e "33[30m 黑色字oldboy trainning 33[0m" echo -e "33[31m 红色字oldboy trainning 33[0m" echo -e "33[32m 绿色字oldboy trainning 33[0m" echo -e "33[33m 黄色字oldboy trainning 33[0m" echo -e "33[34m 蓝色字oldboy trainning 33[0m" echo -e "33[35m 紫色字oldboy trainning 33[0m" echo -e "33[36m 天蓝字oldboy trainning 33[0m" echo -e "33[37m 白色字oldboy trainning 33[0m" 背景颜色: echo -e "33[40;37m 黑底白字 welcome to old1boy33[0m" echo -e "33[41;37m 红底白字 welcome to old2boy33[0m" echo -e "33[42;37m 绿底白字 welcome to old3boy33[0m" echo -e "33[43;37m 黄底白字 welcome to old4boy33[0m" echo -e "33[44;37m 蓝底白字 welcome to old5boy33[0m" echo -e "33[45;37m 紫底白字 welcome to old6boy33[0m" echo -e "33[46;37m 天蓝白字 welcome to old7boy33[0m" echo -e "33[47;30m 白底黑字 welcome to old8boy33[0m" 关闭颜色33[0m

    3、for语句

    ①语法

    for i(变量) in {1..10}  in后面可以加命令`ls`  `seq 10`
    
    do
    
         echo $i
    
    done

    ②通过for循环优化开机启动

    #!/bin/sh
    Close_Service=`chkconfig|grep 3:on|awk '{print $1}'|egrep -v "crond|network|sshd|rsyslog|sysstat"`
    for name in $Close_Service
    do
      chkconfig $name off
    done

    4、while语句

    ①语法

    while 条件
      do
        命令
    done 
    
    条件永远成立--死循环
    守护进程:不停止的进程
    
    true

    ②while按行读文件的方式

    方式一、
    exec <file
    sum=0
    while read line
    do
         cmd
    done
    方式二、
    cat ${file_path}|while read line
    do
          cmd
    done
    方式三while read line
    do
           cmd
    done<file

    ③防止脚本中断的方法

    1、sh while.sh &
    2、nohup /server/scripts/uptime.sh &
    3、screen,保持会话
    

    5、函数

    ①语法

    #!/bin/bash
    oldboy(){
        echo "Hello world"
    }  

    注:oldboy为定义的函数,执行时不需要带小括号,函数定义及函数体必须在要执行的函数名的前面定义

    ②带参数的函数执行方法

    在函数体中位置参数($1、$2、$3...$#、$*以及$@)都可以是函数的参数。
    父脚本的参数临时被函数参数所掩盖或隐藏。
    $0比较特殊,他仍然是父脚本的名称。
    当函数完成时,原来的命令行参数会恢复
    
    #!/bin/bash
    function oldboyedu(){
        echo "Hello world"
        echo $0
        echo $1
        echo $2
        exit
    }
    
    etiantian(){
        echo "good"
        return 3
        echo 'bad'
    }
    
    #oldboyedu hanshu1 hanshu2
    oldboyedu $1 $2
    etiantian

    ③如何写好函数脚本

    #分层
    #每一个步骤可以写成一个函数
    #每一个功能分拆为函数 

    ④函数优势

    把相同的程序段定义成函数,可以减少程序代码量。
    增加程序的可读、易读性。
    实现程序的功能模块化。

    6、shell数组

    x=(1 2 3)
    
    # 打印所有数组内容
    [root@oldboyedu scripts]# echo ${x[*]}
    1 2 3
    #打印数组元素
    [root@oldboyedu scripts]# echo ${x[0]}
    1
    [root@oldboyedu scripts]# echo ${x[1]}
    2
    [root@oldboyedu scripts]# echo ${x[2]}
    3
    #打印数组长度
    [root@oldboyedu scripts]# echo ${#x[@]}
    3
    [root@oldboyedu scripts]# echo ${#x[*]}
    3

    二、各个语句应用场景

    if(取值判断)

    for(正常循环处理)语句最常用,

    while(守护进程无限循环,小于1分钟的任务都可以用while循环)

    case(系统服务启动脚本)

    三、shell脚本调试

    ①要记得首先用dos2unix对脚本格式化。
    ②直接执行脚本根据报错来调试,有时报错不准确。
    ③sh -x调试整个脚本,显示执行过程。
    ④set -x和set +x调试部分脚本(在脚本中设置)
    ⑤echo输出变量及相关内容,然后紧跟着exit退出,不执行后面程序的方式,一步步跟踪脚本,对于逻辑错误比较好用。
    写法:echo $var;exit
    ⑥最关键的是语法熟练、编码习惯、编程思想,将错误扼杀在萌芽之中,减轻调试负担,提高效率

    四、控制循环结构中的走向

    命令

    说明

    break n

    n表示跳出循环的层数,如果省略n表示跳出整个循环

    continue n

    n表示退出到第n层继续循环,如果省略n表示跳过本次循环,忽略本次循环的代码,进入循环的下一次循环

    exit n

    退出当前shell程序,n为返回值,n也可以省略,在下一个shell里通过$?接收这个n的值

    return n

    用在函数里,作为函数的返回值,用于判断函数执行是否正确,和exit一样,如果函数里有循环,也会直接退出循环,退出函数

    1、 break 跳出整个循环,继续循环后面的程序执行
    2、 continue 结束本次循环,继续下一次循环
    3、 exit 退出整个脚本

    成功最有效的方法就是向有经验的人学习!
  • 相关阅读:
    react-native ios打包和Android打包
    用create-react-app创建的react项目怎么解决打包体积过大
    react native 新建项目运行报错
    微信分享等配置,微信授权失败讲解
    微信公众号的code,微信授权
    linux 递归删除指定文件
    mariaDB安装 无密码就可以登录、远程访问、及新版本初始化密码
    mysql 可重复插入、创建语句
    redis数据库入门
    Extjs 3.4 同值合并
  • 原文地址:https://www.cnblogs.com/yanxinjiang/p/8023803.html
Copyright © 2011-2022 走看看