Shell-条件控制语句1

案例: 写一个脚本传参的方式做一个计算器 加减乘除
    [root@test day3]# cat count.sh 
    #!/bin/bash
    expr $1 + $2 &>/dev/null
    [ $? -ne 0 ] && exit
    echo $1+$2=$[$1+$2]
    echo $1-$2=$[$1-$2]
    echo $1*$2=$[$1*$2]
    echo $1/$2=$[$1/$2]
    num1=$1
    num2=$2
    echo $num1/$num2=$[$num1/$num2]
    echo $num1+$num2=$[$num1+$num2]
    echo $num1-$num2=$[$num1-$num2]
    echo $num1*$num2=$[$num1*$num2]

    read -p "Please Input two Number: " num1 num2
    echo $num1/$num2=$[$num1/$num2]
    echo $num1+$num2=$[$num1+$num2]
    echo $num1-$num2=$[$num1-$num2]
    echo $num1*$num2=$[$num1*$num2]

案例: 使用read传参 输入两个整数 是否为整数做判断 然后比对两个数字的大小(禁止使用if)
注意正则表达式: 并且&& 或者||

[root@test day3]# cat diff.sh 
#!/bin/bash
read -p "Please input two number: " num1 num2
if [[  $num1 =~ ^[0-9]+$ && $num2 =~ ^[0-9]+$ ]];then
    [ $num1 -gt $num2 ] && echo "$num1>$num2"
    [ $num1 -lt $num2 ] && echo "$num1<$num2"
    [ $num1 -eq $num2 ] && echo "$num1=$num2"
else
    exit
fi

案例: 
1. 获取磁盘使用率
2. 获取到的值如果大于80则发送邮件告警 小于80则提示磁盘使用率正常 并输出当前的值
    [root@test day3]# cat disk.sh
    #!/bin/bash
    . /etc/init.d/functions
    use_disk=`df -h|awk '/\/$/{print $(NF-1)}'`
    if [ ${use_disk%\%} -gt 15 ];then
       action "磁盘使用不正常" /bin/false
    else
        action "磁盘使用正常: $use_disk" /bin/true
    fi
    [root@test day3]# sh disk.sh
    磁盘使用正常: 11%                                          [  OK  ]

1. 获取内存使用率
2. 如果内存值大于80则提示内存使用异常输出当前值 小于80则提示内存使用正常 输出当前值

    [root@test day3]# cat free.sh
    #!/bin/bash
    . /etc/init.d/functions
    use_free=`free|awk 'NR==2{print $3/$2*100}'`
    if [ ${use_free%.*} -lt 10 ];then
       action "内存使用不正常: $use_free" /bin/false
    else
        action "内存使用正常: $use_free" /bin/true
    fi
    [root@test day3]# sh free.sh
    内存使用正常: 11.8201                                      [  OK  ]
    [root@test day3]# vim free.sh 
    [root@test day3]# sh free.sh 
    内存使用不正常: 11.8186                                    [FAILED]


1. 获取Linux操作系统的以下信息 输出到屏幕:
  ETH0ip地址
  公网IP地址
  系统版本
  虚拟平台Virtualization
  内核版本
  主机名称
  磁盘使用率
  内存使用率
  负载
  网络是否正常
  
   [root@test day3]# cat test.sh 
    #!/bin/bash
    [ -f /etc/init.d/functions ] && source /etc/init.d/functions
    fidsk=`df -h | grep 11|awk '{print $(NF-1)}'|grep 11 -o`
     [ $fidsk -ge 80  ] && mail -s '磁盘报警' 798924094@qq.com < /server/scripts/fidsk.txt&>/dev/null || action "磁盘使用率" /bin/true 
    sleep 0.5
    eth0=`ifconfig eth0|awk -F: NR==1'{print $1}'`
    if [ $eth0 = $eth0 ];then
      action "IP地址是: $eth0:$IP" /bin/true 
    else
      action "IP地址是: $eth0:$IP" /bin/false
    fi
    sleep 0.5
    gwIP=`curl -s cip.cc|grep ^IP |awk '{print $3}'`
    if [ $gwIP = $gwIP ];then
      action "公网IP地址: $gwIP" /bin/true
    else 
      action "公网IP地址: $gwIP" /bin/false 
    fi
    sleep 0.5
    xtbb=`hostnamectl|grep Cen|awk '{print $3,$4,$5}'`
    if [ xtbb = xtbb ];then
      action  "系统版本为: $xtbb"  /bin/true
    else
      action  "系统版本为: $xtbb" /bin/false
    fi
    sleep 0.5
    xuni=`hostnamectl|grep vmwar|awk '{print $2}'`
    if [ $xuni = $xuni ];then
      action "虚拟平台为: $xuni"   /bin/true
    else
      action  "虚拟平台为: $xuni"  /bin/false
    fi
    sleep 0.5
    shuzi=`hostnamectl|grep x86-64|awk '{print $2}'`
    if [ $shuzi = $shuzi ];then
      action   "内核版本为: $shuzi"  /bin/true
    else
      action   "内核版本为: $shuzi" /bin/false
    fi
    sleep 0.5
    name=`hostname`
    if [ $name = $name ];then
      action   "主机名为: $name"  /bin/true
    else
      action   "主机名为: $name"  /bin/false
    fi
    sleep 0.5
    free=`free -h|awk NR==2'{print $3/$2*100}'|awk -F [.4]+ '{print $1}'`
    if [ $free -ge 80  ];then
      mail -s "内存溢出" 798924094@qq.com < 内存溢出超过80
    else
      action "内存的使用率为: $free"  /bin/true
    fi
    sleep 0.5
    uptime=`uptime|awk -F "[ ,]+" '{print $(NF-2)}'|awk -F. '{print $1}'`
    if [ $uptime -ge 60 ];then
       mail -s "内存溢出" 798924094@qq.com < 内存溢出超过80
    else
      action "负载状态: $uptime"  /bin/true
    fi
    sleep 0.5
    ping -c1 -W1 www.baidu.com &>/dev/null
    if [ $? -eq 0 ];then
       action "网络情况" /bin/true
    else
       action "网络情况" /bin/false
    fi
     
  
  
  
  
  
  
  
  
  
  
  
  
一.if判断  
语法结构:
单分支语句: 一个条件 一个结果
第一种写法: then在表达的后面 加个分号;
if 条件表达式;then
   执行的命令集合
fi
第二种写法: then在if的下面条件表达式的后面不需要加分号;
if 条件表达式
then
    执行命令
fi

if [ 20 -eq 20 ]
then 
    echo ok
fi

if [ -f /etc/hosts ];then
   echo 文件存在
fi

if [[ root =~ ^r ]]
then 
    echo ok
fi


if的单分支和&& 相同 
一个条件 一个结果

[root@test day3]# [ 10 -eq 10 ] && echo ok
ok
[root@test day3]# [ 10 -eq 11 ] && echo ok

[root@test day3]# cat if.sh
if [ 10 -eq 10 ]
then
    echo ok
fi


单条件
if  [ 你有房 ]
then
    我就嫁给你
fi 

双分支 一个条件 两个结果
if [ 你有房 ]
then 
    我就嫁给你
else
    拜拜
fi

[ 10 -eq 10 ] && echo 成立 || echo 不成立 

多分支 多个条件 多个结果
if [ 你有房 ]
then 
    我就嫁给你 
elif [ 你有钱 ]
then
    我也嫁给你
elif [ 你活好 ] Linux学的好
then
    先处对象
else
    拜拜
fi


案例: 根据不同的操作系统版本安装不同的YUM源
1. 获取操作系统版本号
2. 通过表达判断
3. 部署YUM仓库
-------------------------- 框架
[root@test day3]# cat if.sh
#!/bin/bash
#获取操作系统版本号
os_vs=`awk '{print $(NF-1)}' /etc/redhat-release`
if [ ${os_vs%%.*} -eq 7 ]
then
    # 备份默认YUM仓库
    mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
    # 下载新的YUM仓库
    wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
elif [ ${os_vs%%.*} -eq 6 ]
then
    # 备份默认YUM仓库
    mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
    # 下载新的YUM仓库
    wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-6.10.repo
elif [ ${os_vs%%.*} -eq 8 ]
then
    # 备份默认YUM仓库
    mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
    # 下载新的YUM仓库 
    wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo
fi
----------------------------------------

完善脚本:
[root@test day3]# cat if.sh 
#!/bin/bash
#获取操作系统版本号
# 调用系统函数库
[ -f /etc/init.d/functions ] && . /etc/init.d/functions

os_vs=`awk '{print $(NF-1)}' /etc/redhat-release`
backup_yum='mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup'

# 判断网络
ping -c1 -W1 www.baidu.com &>/dev/null
if [ $? -ne 0 ]
then
    systemctl restart network
    if [ $? -eq 0 ];then
        action "重启网卡成功" /bin/true
    else
        action "网卡重启失败请手动检查配置" /bin/false
    fi
    ping -c1 -W1 www.baidu.com &>/dev/null
    [ $? -ne 0 ] && action "请管理手动检查网络" /bin/false
fi

# 判断wget是否存在 不存在则安装
which wget &>/dev/null
if [ $? -ne 0 ]
then
    echo "正在安装wget请稍等........"
    yum -y install wget &>/dev/null
    if [ $? -eq 0 ];then
    action "wget install is " /bin/true
    else
    action "wget install is" /bin/false
    echo "正在安装wget安装成功继续执行脚本.."
    fi
fi

if [ ${os_vs%%.*} -eq 7 ]
then
    # 备份默认YUM仓库
    $backup_yum
    # 下载新的YUM仓库
    wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo &>/dev/null
    if [ $? -eq 0 ];then
    action "yum仓库安装" /bin/true
    else
    action "yum仓库安装" /bin/false
    fi

elif [ ${os_vs%%.*} -eq 6 ]
then
    # 备份默认YUM仓库
    $backup_yum
    # 下载新的YUM仓库
    wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-6.10.repo
elif [ ${os_vs%%.*} -eq 8 ]
then
    # 备份默认YUM仓库
    $backup_yum
    # 下载新的YUM仓库 
    wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo
fi
--------------------------------------------------------------

案例: 输入两个整数判断比较两个数大小
[root@test day3]# cat num.sh 
#!/bin/sh
read -p "Please Input two Number: " num1 num2
if [[ ! $num1 =~ ^[0-9]+$ || ! $num2 =~ ^[0-9]+$ ]];then
   echo "请输入整数"
   exit
fi
if [ $num1 -gt $num2 ]
then
    echo "$num1 > $num2"
elif [ $num1 -lt $num2 ]
then
    echo "$num1 < $num2"
else
    echo "$num1 = $num2"
fi


案例: if菜单
打印输出菜单 安装多个不同的版本
[root@test day3]# cat server.sh 
#!/bin/sh
echo -e "\t\t\t\t\t \033[40;32m 1.PHP \033[0m"
echo -e "\t\t\t\t\t \033[40;32m 2.Redis \033[0m"
echo -e "\t\t\t\t\t \033[40;32m 3.MySQL \033[0m"
echo -e "\t\t\t\t\t \033[40;32m 4.Nginx \033[0m"
cat<<EOF
         1.PHP
         2.Redis
         3.MySQL
         4.Nginx
EOF

二级菜单:
[root@test day3]# cat server.sh 
#!/bin/sh
echo -e "\t\t\t\t\t \033[40;32m 1.PHP \033[0m"
echo -e "\t\t\t\t\t \033[40;32m 2.Redis \033[0m"
echo -e "\t\t\t\t\t \033[40;32m 3.MySQL \033[0m"
echo -e "\t\t\t\t\t \033[40;32m 4.Nginx \033[0m"
read -p "请输入你要安装的服务名称或者编号:[1|PHP|2|Redis|3|MySQL|4|Nginx] " num
if [ $num = 1 -o $num = PHP ]
then
        echo -e "\t\t\t\t\t \033[40;34m 1.PHP5.4 \033[0m"
    echo -e "\t\t\t\t\t \033[40;34m 2.PHP7.1 \033[0m"
    echo -e "\t\t\t\t\t \033[40;34m 3.PHP7.2 \033[0m"
    echo -e "\t\t\t\t\t \033[40;34m 4.PHP7.4 \033[0m"
        read -p "请选择你要安装的版本号:[1|2|3]" num
        if [ $num -eq 1 ];then
           echo "yum_install_php5.4............."
        elif [ $num -eq 2 ];then
           echo "yum_install_php7.1............."
    else
       echo "请按照菜单选择别瞎选!!!"
          exit
    fi

elif [ $num = 2 -o $num = Redis ]
then
        echo -e "\t\t\t\t\t \033[40;33m 1.Redis-1.6 \033[0m"
        echo -e "\t\t\t\t\t \033[40;33m 2.Redis-1.7 \033[0m"
        echo -e "\t\t\t\t\t \033[40;33m 3.Redis-1.8 \033[0m"
        echo -e "\t\t\t\t\t \033[40;33m 4.Redis-1.9 \033[0m"
                read -p "请选择你要安装的版本号:[1|2|3]" num
        if [ $num -eq 1 ];then
           echo "yum_install_redis1.6............."
        elif [ $num -eq 2 ];then
           echo "yum_install_redis1.7............."
        fi
else
   echo "请按照菜单选择别瞎选!!!"
   exit

fi


------------------------------完善
[root@test day3]# cat server.sh
#!/bin/sh
while true
do
    echo -e "\t\t\t\t\t \033[40;32m 1.PHP \033[0m"
    echo -e "\t\t\t\t\t \033[40;32m 2.Redis \033[0m"
    echo -e "\t\t\t\t\t \033[40;32m 3.MySQL \033[0m"
    echo -e "\t\t\t\t\t \033[40;32m 4.Nginx \033[0m"
    echo -e "\t\t\t\t\t \033[40;32m 5.退出脚本 \033[0m"
    read -p "请输入你要安装的服务名称或者编号:[1|PHP|2|Redis|3|MySQL|4|Nginx] " num
    if [ $num = 1 -o $num = PHP ]
    then
        while true
         do
        echo -e "\t\t\t\t\t \033[40;34m 1.PHP5.4 \033[0m"
        echo -e "\t\t\t\t\t \033[40;34m 2.PHP7.1 \033[0m"
        echo -e "\t\t\t\t\t \033[40;34m 3.PHP7.2 \033[0m"
        echo -e "\t\t\t\t\t \033[40;34m 4.PHP7.4 \033[0m"
        echo -e "\t\t\t\t\t \033[40;34m 5.返回主菜单 \033[0m"
        read -p "请选择你要安装的版本号:[1|2|3]" num
        if [ $num -eq 1 ];then
           echo "yum_install_php5.4............."
        elif [ $num -eq 2 ];then
           echo "yum_install_php7.1............."
        elif [ $num -eq 5 ];then
              break
        else
           echo "请按照菜单选择别瞎选!!!"
           exit
        fi
         done
    elif [ $num = 2 -o $num = Redis ]
    then
        echo -e "\t\t\t\t\t \033[40;33m 1.Redis-1.6 \033[0m"
        echo -e "\t\t\t\t\t \033[40;33m 2.Redis-1.7 \033[0m"
        echo -e "\t\t\t\t\t \033[40;33m 3.Redis-1.8 \033[0m"
        echo -e "\t\t\t\t\t \033[40;33m 4.Redis-1.9 \033[0m"
            read -p "请选择你要安装的版本号:[1|2|3]" num
        if [ $num -eq 1 ];then
           echo "yum_install_redis1.6............."
        elif [ $num -eq 2 ];then
           echo "yum_install_redis1.7............."
        fi
    elif [ $num = 5 ]
        then
         exit
    else
       echo "请按照菜单选择别瞎选!!!"
       echo "请重新输入编号"

        fi


done
----------------------------------------------------------------------------


案例: 
猜数字游戏
1.生成一个随机数
2.让用户输入数字
3.猜大小  大了提示大了 小则提示小了 输入正确则提示恭喜猜对了

$RANDOM 数字范围: 0-32767

echo $((RANDOM%100+1)) 1-100的数字

[root@test day3]# cat ran.sh 
#!/bin/bash
ran=`echo $((RANDOM%100+1))`

while true
do
    let i++
    read -p "请你输入要猜的数字[1-100]: " num
    if [ $num -gt $ran ]
    then
       echo "你输入数字的大了"
    elif [ $num -lt $ran ]
    then
       echo "你输入数字的小了"
    else
         echo "恭喜你猜对了中奖号码是: $ran"
         echo "总共猜了$i 次"
         exit
    fi
done

作业: 
系统自动猜 并且统计猜的数字
系统猜过的数字放入一个文本
然后过滤统计判断 如果有则重复赋值
(重复赋值)

[root@test day3]# cat test.sh
#!/bin/bash
> 1.txt
num=`echo $((RANDOM%100+1))`
while true
do
            while true
        do
        ran=`echo $((RANDOM%100+1))`
        if [ `grep -w $ran 1.txt|wc -l` -eq 1  ];then
                continue   忽略剩余语句,从头开始继续执行 
            else
               let i++
           echo $ran >> 1.txt
           break
            fi
        done
        if [ $num -eq $ran ];then
           echo "恭喜系统猜对了$i 次"
           exit
        fi

done


双色球
6红+1个篮球  共7个号码
6红数字范围: 1-33
1个篮球:     1-16

ran1=`echo $((RANDOM%100+1))`
ran2=`echo $((RANDOM%100+1))`
ran3=`echo $((RANDOM%100+1))`

当前1-33里的数字被赋值 不能在给其他变量赋值

二.for循环
for 变量名称 in  取值列表
do
    动作
done

取值列表: 数字 字符串 命令 序列 以空格为分隔符

    循环数字:
    [root@test day3]# cat for.sh
    #!/bin/bash
    for i in 1 2 3 4 5
    do
        echo $i
    done
    [root@test day3]# sh for.sh
    1
    2
    3
    4
    5

循环字符串
    [root@test day3]# cat for.sh
    #!/bin/bash
    for i in oldboy test1 lidao
    do
        echo $i
    done
    [root@test day3]# sh for.sh
    oldboy
    test1
    lidao

值的列表可以使用双引号引用
    [root@test day3]# cat for.sh
    #!/bin/bash
    for i in "oldboy test1" lidao
    do
        echo $i
    done
    [root@test day3]# sh for.sh
    oldboy test1
    lidao

注意: 输出的结果可以和for循环的列表没有任何关系 和循环次数有关 赋值几次则动作执行几次
    [root@test day3]# cat for.sh
    #!/bin/bash
    for i in a b c
    do
        echo ok
    done
    [root@test day3]# sh for.sh
    ok
    ok
    ok
统计循环或者赋值次数
    [root@test day3]# cat for.sh
    #!/bin/bash
    for i in a b c
    do
        let a++
    done
    echo $a
    [root@test day3]# sh for.sh
    3

for循环读取文件
    [root@test day3]# cat /etc/hosts
    127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
    ::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
    [root@test day3]# cat for.sh 
    #!/bin/bash
    for i in `cat /etc/hosts`
    do
        echo $i
    done
    [root@test day3]# sh for.sh 
    127.0.0.1
    localhost
    localhost.localdomain
    localhost4
    localhost4.localdomain4
    ::1
    localhost
    localhost.localdomain
    localhost6
    localhost6.localdomain6

for循环支持序列
    [root@test day3]# cat for.sh
    #!/bin/bash
    for i in {a..c}
    do
        echo $i
    done
    [root@test day3]# sh for.sh
    a
    b
    c


    [root@test day3]# cat for.sh
    #!/bin/bash
    for i in {1..10}
    do
        echo $i
    done
    [root@test day3]# sh for.sh
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10


    [root@test day3]# cat for.sh
    #!/bin/bash
    for i in `seq 10`
    do
        echo $i
    done

案例1: 测试一个网段内的IP地址是否在线  笔试题
       ping通则为在线
       
       [root@test day3]# cat for.sh 
        #!/bin/bash
        for i in {1..10}
        do
           {
            ip=10.0.0.$i
            ping -c1 -W1 $ip &>/dev/null
            if [ $? -eq 0 ]
            then
                echo "$ip 在线"
            fi
            } &
        done
        wait   # 等待后台程序执行完毕后继续往下执行
        echo done..................

案例2: 批量创建用户  每个用户8位随机密码 并且保存用户名对应密码关系表
       要求用户输入前缀 用户输入个数test01..test10
       echo "123456" | passwd --stdin root 
       
       
    [root@test day3]# cat user.sh 
    #!/bin/bash
    read -p "请输入用户名称的前缀: " prefix
    read -p "请输入要创建用户的个数: " num
    for i in `seq $num`
    do
        echo ${prefix}$i
    done
    read -p "删除还是创建以上用户[y|n]" re
    if [ $re = y ]
    then
        for a in `seq $num`
        do
           user=${prefix}$a
           id $user &>/dev/null
           if [ $? -ne 0 ];then
              useradd $user
              if [ $? -eq 0 ];then
             echo "$user 创建成功"
          fi
           else
              echo "useradd: user $user 已存在"
           fi
        done  
    elif [ $re = n ]
    then
       for b  in `seq $num`
       do
           user=${prefix}$b
           id $user &>/dev/null
           if [ $? -eq 0 ];then
              userdel -r $user
              [ $? -eq 0 ] && echo "$user 删除成功"
           else
              echo "$user 不存在"
           fi
       done

    fi


案例3: for循环从1加到100 笔试题
[root@test day3]# cat for1.sh 
#!/bin/bash
for i in {1..100}
do
     count=$[$count+$i]
done
echo $count
[root@test day3]# cat for1.sh
#!/bin/bash
for i in {1..100}
do
     count=$[count+i]        # 此处括号中可以不加$
done
echo $count

[root@test day3]# seq -s + 100|bc
5050


案例4:反向破解随机数的MD5值

[root@test day3]# cat for2.sh 
num1=31d30eea8d0968d6458e0ad0027c9f80
for i in `seq 15`
do
         ran=`echo ${i}|md5sum|awk '{print $1}'`
         if [ $num1 = $ran ]
         then
             echo "$i $ran"
     fi
done
[root@test day3]# sh for2.sh
10 31d30eea8d0968d6458e0ad0027c9f80

----------------破解出对应的数字
4f9f2d27
091ba725
acf6c3a0
f3f5799e
1fe0fee
a4954ca
--------------------------------

作业: 编写吃饭脚本
1. 菜单
   快餐
   炒菜
   驴肉火烧
   王八
   ...
   ...
2. 按键随机选择中午晚上吃啥

1.菜单 价格
2.会员卡 直接消费 (加会员卡密码) 预留邮箱 找回密码
3.没有会员 是否办理 办理是否有有优惠冲1000送亿万 数值写入文件中 会员姓名: 存储余额
4.消费点菜
5.结账会员结账 处理文本
6.将余额发送企业微信


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值