linux12shell编程 -->流程if判断

流程控制之if判断

一、单分支if

1、语法
if 条件;then
    要执行的命令1
 	要执行的命令2
    要执行的命令3
    ...
fi

# 上述语法可以用一行代码代替
[ 条件信息 ] && xxx
# 案例
[root@openvpn shell]# cat if1.sh 
# !/bin/bash
if [ $# -ne 2 ] || [[ ! $1 =~ ^[0-9]+$ ]] || [[ ! $2 =~ ^[0-9]+$ ]];then
    echo  "Usage: $0 arg1 arg2"
    echo "arg1 必须是整型数字"
    echo "arg2 必须是整型数字"

    exit
fi
2、示例
# 案例一
[root@openvpn shell]# cat check_disk.sh 
#! /bin/bash

use=`df -h | grep "/$" |awk '{print $5}'|cut -d% -f1`

if [ $use -gt 1 ];then
    echo "df: ${use}% warning:Not enough hard disk space"
fi
# 案例二
[root@openvpn shell]# cat ps-aux.sh 
#! /bin/bash
if ps -aux |grep [s]sh &>/dev/null;then
    echo "sshd is up"

fi

# 案例三
[root@openvpn day1]# cat check_disk1.sh 
#! /bin/bash

NUM=0
for i in `df -h | egrep '[0-9]+%' |awk '{print $5}' |cut -d% -f1`
do
    if [ $i -ge 10 ];then
         let NUM++
    fi
done

echo "当磁盘使用率超过10%的个数:$NUM"

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

[root@lb4 yum.repos.d]# if ls ;then echo ok;fi
backup  mm.repo
ok
[root@openvpn /]# if grep -q root /etc/passwd ;then echo Y ;fi
Y

二:双分支if

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

# 上述语法可以用一行代码代替
[ 条件信息 ] && xxx || xxxx
2、示例
#!/bin/bash
username='openvpn'
password='123'
read -p 'user: ' name 
read -p 'passwd: ' passwd

if [[ $name == $username ]] && [[ $password == $passwd ]];then
    echo 'login successful'
else
    echo 'username or password err'
fi

三:多分支if

1、语法:
if 条件;then
    要执行的命令1
 	要执行的命令2
    要执行的命令3
    ...
elif 条件;then
    要执行的命令1
 	要执行的命令2
    要执行的命令3
    ...
...
else
    要执行的命令1
 	要执行的命令2
    要执行的命令3
    ...
fi
示例1:猜年龄
======================版本1======================
#!/bin/bash
age=18
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
# 方式二
[root@openvpn day1]# cat age.sh 
#! /bin/bash

age=18
read -p "请输入年龄:" ager

if [ $ager -eq $age ];then
    echo "ok"
elif [ $ager -ge $age ];then
    echo "big"
else
     echo "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"


# 方式二
[root@openvpn day1]# cat num1.sh 
while true;
do
read -p "请输入一个数值>> " num1
     if [[ $num1 =~ ^[0-9]+ ]];then
          break
     else
          echo  "不是数字重新输入" 
    fi

done

四 、练习

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@openvpn test]# cat ping.sh 
#!/bin/bash

ping -c2 $1 &>/dev/null
if [ $? -eq 0 ];then
    echo "ok"
else
    echo "down"
fi
# 方式二
[root@openvpn day1]# cat ping.sh 
#!/bin/bash
read -p "请输入ip :" IP

ping -c1 -t1 $IP &>/dev/null

if [ $? -eq 0 ];then
    echo "ok"
    else
        echo "down"
	fi

[root@openvpn test]# chmod +x ping.sh 
[root@openvpn test]# ./ping.sh 10.10.0.1
down
[root@openvpn test]# 
3、判断一个用户是否存在
[root@openvpn 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@openvpn test]# chmod +x check_user.sh 
[root@openvpn test]# ./check_user.sh openvpn
user openvpn exists
[root@openvpn test]# ./check_user.sh xx
user xx not exists
4、检测nginx软件是否安装,没有的话则安装
[root@openvpn test]# cat check_nginx.sh
#!/bin/bash

rpm -q nginx &>/dev/null
if [ $? -eq 0 ];then
    echo "已经安装"
else
    echo "正在安装..."
    yum install nginx -y &>/dev/null
fi
5、判断80端口的状态,未开启则重启
[root@openvpn test]# cat check_port.sh 
#!/bin/bash

netstat -an |grep LISTEN |grep '\b80\b' &>/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

# 检测端口
[root@openvpn day2]# cat port.sh 
# !/bin/bash
[ $# -ne 1 ] && echo "Usage: $0 port" && exit

netstat -an |grep -iw "listen" |grep $1 &> /dev/null


if [ $? -eq 0 ];then
    echo "nginx $1 is ok"
else
    echo "nginx $2 is down"
fi
6、编写监控脚本、配置邮箱
1)编写监控脚本
要求如果:
       根分区剩余空间小于10%
       内存的可用空间小于30%
       向用户openvpn发送告警邮件,邮件的内容包含使用率相关信息
[root@openvpn day2]# cat disk.sh 
#!/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 "硬盘报警邮件" 1715554782@qq.com
fi
if [ $avail_percent -lt 30 ];then
     echo "邮件内容:内存剩余${free_percent}%,低于30%" | mail -s "内存报警邮件" 1715554782@qq.com
fi
2)测试:
# 查看qq邮箱
# [root@openvpn test]# cat /var/spool/mail/root 
3)mailx配置
[root@openvpn ~]# yum install mailx -y
[root@openvpn ~]# 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/

[root@openvpn day2]# cat /etc/mail.rc  #正确的
  set from=1715554782@qq.com
  set smtp=smtp.qq.com  
  set smtp-auth-user=1715554782
  set smtp-auth-password=tfdxmfopkacdbhae
  set smtp-auth=login 
解释
set from:设置发件人
set smtp:设置外部STMP服务器
set smtp-auth-user:设置STMP用户名(一般为完整邮箱地址)
set smtp-auth-password:设置SMTP密码,需要登录378533872@qq.com在设置->账户->开启POP3/SMTP服务->获取密码
测试
[root@openvpn ~]# echo "卧槽" | mail -s "报警邮件" 1715554782@qq.com
[root@openvpn ~]# Error in certificate: Peer's certificate issuer has been marked as not trusted by the.
5)上述报错的解决方式为,依次执行下述命令
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@openvpn ~]# 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

# 然后重新测试邮件发送即可
6)根据操作系统不同进行yum源优化 centos6 centos7 centos8
[root@openvpn 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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FikL-09-19

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值