zoukankan      html  css  js  c++  java
  • 流程控制之if判断

    一:单分支if

    语法

    if 条件;then
        要执行的命令1
     	要执行的命令2
        要执行的命令3
        ...
    fi
    
    # 上述语法可以用一行代码代替
    [ 条件信息 ] && xxx
    

    示例

    [root@egon test]# cat disk_monitor.sh 
    #!/usr/bin/env bash
    
    disk_use=$(df -P |grep '/$' |awk '{print $5}' |awk -F% '{print $1}')
    if [ $disk_use -gt 10 ];then
        echo "warning:Not enough hard disk space"
    fi
    [root@egon test]# . disk_monitor.sh 
    warning:Not enough hard disk space
    

    注意:if 测试中还可以执行命令 根据命令的返回值做判断

    [root@egon ~]# if cd / ;then echo Y ;fi
    Y
    [root@egon /]# if grep -q root /etc/passwd ;then echo Y ;fi
    Y
    

    二:双分支if

    语法

    if 条件;then
        要执行的命令1
     	要执行的命令2
        要执行的命令3
        ...
    else
        要执行的命令1
     	要执行的命令2
        要执行的命令3
        ...
    fi
    
    # 上述语法可以用一行代码代替
    [ 条件信息 ] && xxx || xxxx
    

    示例

    #!/bin/bash
    username='egon'
    password='123'
    read -p 'user: ' name 
    read -p 'passwd: ' passwd
    
    if [ $name = $username -a $passwd = $password ];then
        echo 'login successful'
    else
        echo 'username or password err'
    fi
    

    三:多分支if

    语法:

    if 条件;then
        要执行的命令1
     	要执行的命令2
        要执行的命令3
        ...
    elif 条件;then
        要执行的命令1
     	要执行的命令2
        要执行的命令3
        ...
    elif 条件;then
        要执行的命令1
     	要执行的命令2
        要执行的命令3
        ...
    ...
    else
        要执行的命令1
     	要执行的命令2
        要执行的命令3
        ...
    fi
    

    示例1:猜年龄

    ======================版本1======================
    #!/bin/bash
    age=87
    read -p 'num: ' n
    
    if [ $n -eq $age ];then
        echo 'you get it'
    elif [ $n -gt $age ];then
        echo 'too big'
    elif [ $n -lt $age ];then
        echo 'too small'
    fi
    
    ======================版本2======================
    #!/bin/bash
    
    read -p ">>> " num
    
    [[ ! $num =~ ^[0-9]+$ ]] && echo "请输入数字" && exit
    
    if [ $num -gt 18 ];then
        echo "too big"
    elif [ $num -lt 18 ];then
        echo "too small"
    else
        echo "you got it"
    fi
    
    

    示例2:查询成绩

    ======================版本1======================
    #!/bin/bash
    read -p 'your score: ' score
    
    if [ $score -ge 90  ];then
        echo '优秀'
    elif [ $score -ge 70 -a $score -lt 90 ];then
        echo '良好'
    elif [ $score -ge 60 -a $score -lt 70 ];then
        echo '一般'
    elif [ $score -lt 60 ];then
        echo '较差'
    fi
    
    ======================版本2======================
    #!/bin/bash
    
    read -p "your score>>> " score
    
    [[ ! $score =~ ^[0-9]+$ ]] && echo "请输入数字" && exit
    
    if [ $score -ge 90 ];then
        echo "优秀"
    elif [ $score -ge 70 ];then
        echo "良好"
    elif [ $score -ge 60 ];then
        echo "一般"
    else
        echo "较差"
    fi
    

    示例3:判断是否是数字

    read -p "请输入一个数值: " num
    
    while :
    do
            if [[ $num =~ ^[0-9]+$ ]];then
                    break
            else
                    read -p "不是数字,请重新输入数值: " num
            fi
    done
    
    echo "你输入的数字是: $num"
    

    四 练习

    1、编写脚本,命令行传入一个文件路径,判断文件的类型

    [root@localhost ~]# cat test_file.sh 
    #!/bin/bash
    if [ -d $1 ]
        then
            echo "$1 is directory"
    elif [ -b $1 ]
        then
            echo "$1 is block"
    elif [ -f $1 ]
        then
            echo "$1 is regular file"
    else
            echo 'unknown'
    fi
    [root@localhost ~]# ./test_file.sh /etc/passwd
    /etc/passwd is regular file
    

    2、检测指定的主机是否可以ping通,必须使用$1变量

    [root@egon test]# cat ping.sh 
    #!/bin/bash
    
    ping -c2 $1 &>/dev/null
    if [ $? -eq 0 ];then
        echo "ok"
    else
        echo "down"
    fi
    [root@egon test]# chmod +x ping.sh 
    [root@egon test]# ./ping.sh 10.10.0.1
    down
    [root@egon test]# 
    

    3、判断一个用户是否存在

    [root@egon test]# cat check_user.sh 
    #!/bin/bash
    
    id $1 &> /dev/null
    if [ $? -eq 0 ];then
        echo "user $1 exists"
    else
        echo "user $1 not exists"
    fi
    [root@egon test]# chmod +x check_user.sh 
    [root@egon test]# ./check_user.sh egon
    user egon exists
    [root@egon test]# ./check_user.sh xx
    user xx not exists
    

    4、检测httpd软件是否安装,没有的话则安装

    [root@egon test]# cat check_httpd.sh
    #!/bin/bash
    
    rpm -q httpd &>/dev/null
    if [ $? -eq 0 ];then
        echo "已经安装"
    else
        echo "正在安装..."
        yum install httpd -y &>/dev/null
    fi
    

    5、判断80端口的状态,未开启则重启

    [root@egon test]# cat check_port.sh 
    #!/bin/bash
    
    netstat -an |grep LISTEN |grep '80' &>/dev/null
    if [ $? -eq 0 ];then
        echo "80端口ok"
    else 
        echo "80端口down"
        echo "正在重启..."
        systemctl restart httpd &> /dev/null
        if [ $? -eq 0 ];then
            echo "重启成功"
        else
            echo "重启失败"
        fi
    fi
    

    6、编写监控脚本,如果
    根分区剩余空间小于10%
    内存的可用空间小于30%
    向用户egon发送告警邮件,邮件的内容包含使用率相关信息

    答案

    [root@egon test]# cat monitor.sh 
    #!/bin/bash
    
    #! /bin/bash
    # 提取根分区剩余空间
    use_disk=`df / | grep / | awk '{print $5}'`
    use_percent=`echo $use_disk|cut -d% -f1`
    
    # 提取内存剩余空间
    avail_mem=`free | awk 'NR==2{print $NF}'`
    total_mem=`free | awk 'NR==2{print $2}'`
    avail_percent=`echo "scale=2;$avail_mem/$total_mem"|bc | cut -d. -f2`
    
    # 注意 磁盘提取的数值单位为 kb、 内存提取的单位为 Mb
    if [ $use_percent -gt 90 ];then
         echo "邮件内容:根分区已经使用为${user_disk}低于10%,请及时处理!!!" | mail -s "硬盘报警邮件" root
    fi
    
    if [ $avail_percent -lt 30 ];then
         echo "邮件内容:内存剩余${free_percent}%,低于30%" | mail -s "内存报警邮件" xxx@163.com
    fi
    

    测试:

    # 查看163邮箱
    # [root@egon test]# cat /var/spool/mail/root 
    

    mailx配置

    [root@egon ~]# yum install mailx -y
    [root@egon ~]# cat /etc/mail.rc
    set from=378533872@qq.com 
    set smtp=smtps://smtp.qq.com:465
    set smtp-auth-user=378533872@qq.com
    set smtp-auth-password="xxxxxxxxxx"
    set smtp-auth=login
    set ssl-verify=ignore
    set nss-config-dir=/etc/pki/nssdb/
    

    解释

    set from:设置发件人
    set smtp:设置外部STMP服务器
    set smtp-auth-user:设置STMP用户名(一般为完整邮箱地址)
    set smtp-auth-password:设置SMTP密码,需要登录378533872@qq.com在设置->账户->开启POP3/SMTP服务->获取密码
    

    测试

    [root@egon ~]# echo "卧槽" | mail -s "报警邮件" 18611453110@163.com
    [root@egon ~]# Error in certificate: Peer's certificate issuer has been marked as not trusted by the.
    

    上述报错的解决方式为,依次执行下述命令

    mkdir -p /root/.certs/
    
    echo -n | openssl s_client -connect smtp.qq.com:465 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > ~/.certs/qq.crt
    
    certutil -A -n "GeoTrust SSL CA" -t "C,," -d ~/.certs -i ~/.certs/qq.crt
    
    certutil -A -n "GeoTrust Global CA" -t "C,," -d ~/.certs -i ~/.certs/qq.crt
    
    certutil -L -d /root/.certs
    
    cd /root/.certs
    
    certutil -A -n "GeoTrust SSL CA - G3" -t "Pu,Pu,Pu" -d ./ -i qq.crt
    
    # 最后出现这句就可以了
    Notice: Trust flag u is set automatically if the private key is present.
    
    # 重新修改配置文件的最后一行
    [root@egon ~]# cat /etc/mail.rc
    set from=378533872@qq.com 
    set smtp=smtps://smtp.qq.com:465
    set smtp-auth-user=378533872@qq.com
    set smtp-auth-password="xxxxxxxxxx"
    set smtp-auth=login
    set ssl-verify=ignore
    # set nss-config-dir=/etc/pki/nssdb/  # 改为下面一行
    set nss-config-dir=/root/.certs
    
    # 然后重新测试邮件发送即可
    

    7、根据操作系统不同进行yum源优化 centos6 centos7 centos8

    [root@egon shell]# cat check_yum.sh 
    #!/bin/bash
    
    mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup &>/dev/null
    var=$(awk '{print $(NF-1)}' /etc/redhat-release)
    os_version=`echo ${var%%.*}`
    if [ $os_version -eq 7 ];then
        wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo &>/dev/null
    elif [ $os_version -eq 6 ];then
        wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo &>/dev/null
    elif [ $os_version -eq 5 ];then
        wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-5.repo &>/dev/null
    else
        echo "请检查确认系统版本信息"
    fi
    
  • 相关阅读:
    解决VS2013中的控制台一闪而过的问题
    无法查找或打开 PDB 文件解决办法
    一些课题
    KVM下raw和qcow2格式磁盘文件IO测试
    CentOS6.5下安装jdk配置环境变量错误问题:
    小代码训练
    tomcat启动一闪而过处理
    Tomcat 中get请求中含有中文字符时乱码的处理
    ssm框架错误展示-1
    a标签指定的url,在表单提交前进行js验证的实现
  • 原文地址:https://www.cnblogs.com/caodan01/p/14948997.html
Copyright © 2011-2022 走看看