Shell语句判断练习题

简介: Shell语句判断练习题

一、条件测试操作

1、文件测试

(1)测试目录/media是否存在,$?返回值为0,表示存在此目录,为其他数字为不存在

1. [ -d /media]
2. echo $?
3. 
4. #此目录存在则输出YES
5. [ -d /media] && echo "yes"

2、整数值比较

(1)判断当前已登录的用户数,当超过5个时输出“too many”。

 

1. USER_SUM=$(who | wc -l)
2. 
3. [ $USER_SUM -gt 5 ] && echo "too many"

(2)判断当前可用的空闲内存(buffers/cache)大小,当低于2048MB输出具体数值。

#提取第四列为剩余的内存空间
FREE=$(free -m | grep "Mem" | awk '{print $4}')
[ $FREE -lt 2048 ] && echo ${FREE}MB

3、字符串比较

(1)用户输入“yes”或“no”来确认强制删除任务

       1.创建文件rm.sh

vim rm.sh

 2.编写代码

#!/bin/bash
IF=""  #初始化
read -p "你要在此目录下删除的文件名:" dev
[ -e "$dev" ] && read -p "是否强制删除${dev}文件:" IF || echo "此文件不存在!"
[ "$IF" = "yes" ] && $(rm -f $dev) && echo "以强制删除${dev}文件!"
[ "$IF" = "no" ] && echo "以取消删除${dev}文件!"

 3.赋予执行权限

chmod +x rm.sh

4、逻辑测试

判断当前linux系统的内核版本是否大于2.4。

A=$(uname -r | awk -F. '{print $1}')
[ "$A" >  2.4 ] && echo "大于2.4版本"

二、if条件语句

1、单分支if语句(参考书上112页的两个案例)

(1)判断挂载点目录,若不存在则自动创建

vim chkmountdir.sh
#!/bin/bash
mount_dir="/media/cdrom/"
if [ ! -d $mount_dir ]
then
    mkdir -p $mount_dir
fi
#赋予权限执行
chmod +x chkmountdir.sh
./chkmountdir.sh

(2)判断当前用户是否为root,如果不是则报错并执行“exit  1”退出脚本,不再执行其他代码。

vim chkifroot.sh
#!/bin/bash
if [ "$USER" != "root" ]
then
    echo "错误:非root用户,权限不足!"
    exit 1
fi
fdisk -l /dev/sda
#赋予权限执行
chmod +x chkifroot.sh
./chkifroot.sh

2、双分支if语句(参考书上113和114页的两个案例)

(1)判断目标主机是否存活,显示检测结果

vim pinghost.sh
#!/bin/bash
ping -c 3 -i 0.2 -w 3 $1 &> /dev/null
if [ $? -eq 0 ]
then 
    echo "host $1 is up."
else
    echo "host $1 is down."
fi
#赋予权限执行
chmod +x pinghost.sh
./pinghost.sh

2)检查vsftpd服务是否运行,若运行则列出监听地址,PID号;否则输出提示“警告,vsftpd服务不可用”。(插入linux系统安装光盘,安装一下vsftpd软件包)

vim chkvsftpd.sh
#!/bin/bash
systemctl status vsftpd &> /dev/null
if [ $? -eq 0 ]
then
    echo "监听地址:$(netstat -anpt | grep vsftpd | awk '{print $4}')"
    echo "进程PID号:$(pgrep -x vsftpd)"
else
    echo "警告:vsftpd服务不可用!"
fi
#赋予权限执行
chmod +x chkvsftpd.sh
./chkvsftpd.sh

3、多分支if语句(参考书上115页的案例)

(1)根据输入的考试分数不同来区分优秀,合格,不合格三挡。

vim gradediv.sh
#!/bin/bash
read -p "请输入你的分数(0-100)": GRADE
if [ $GRADE -ge 85 ] && [ $GRADE -le 100 ]
then
    echo "$GRADE分,优秀!"
elif [ $GRADE -ge 70 ] && [ $GRADE -le 84 ]
then
    echo "$GRADE分,合格"
else
    echo "$GRADE分,不合格"
fi
#赋予权限执行
chmod +x gradediv.sh
./gradediv.sh

三、编写系统监控脚本

实验要求如下


使用df命令提取出根分区的磁盘占用率,赋值给变量DUG

使用mpstat命令提取CPU使用率(需安装sysstat软件包),赋值给变量CUG。

使用free命令提取出内存使用率,赋值给变量MUG。

使用ps命令统计进程数,赋值给变量PUG

使用who命令统计登录的用户数,赋值给UUG

判断上述监控项目是否超标,将需要告警的信息保存到/tmp/alert.txt文件。

判断/tmp/alert.txt文件是否存在,若存在则作为告警邮件发送。

vim sysmon.sh
#!/bin/bash
# 提取性能监控指标(磁盘占用、CPU使用、内存使用)
DUG=$(df -hT | grep "/$" | awk '{print $6}' | awk -F% '{print $1}')
CUG=$(expr 100 - $(mpstat | tail -1 | awk '{print $12}' | awk -F. '{print $1}'))
MUG=$(expr $(free | grep "Mem" | awk '{print $3}') \* 100 / $(free | grep "Mem:" | awk '{print $2}'))
PUG=$(ps aux|wc  -l)
UUG=$(who|wc  -l)
# 设置告警日志文件、告警邮箱
ALOG="/tmp/alert.txt"
AMAIL="root "
# 判断是否记录告警
if [ $DUG -gt 90 ]
then
    echo "磁盘占用率:$DUG %" >> $ALOG
fi
if [ $CUG -gt 80 ]
then
    echo "CPU使用率:$CUG %" >> $ALOG
fi
if [ $MUG -gt 90 ]
then
    echo "内存使用率:$MUG %" >> $ALOG
fi
if [ $PUG -gt 200 ]
then
  echo “启动的进程超过了200,太多了” >>$ALOG
fi
if [ $UUG -gt 5 ]
then
  echo “登录的用户超过5个了,太多了” >>$ALOG
fi
# 判断是否发送告警,将告警信息显示在屏幕上,最后删除告警日志文件
if [ -f $ALOG ]
then
    cat $ALOG | mail -s "Host Alert" $AMAIL
    rm -rf $ALOG
fi

测试:

如果达不到指定数值可以根据自己的电脑来改参数

chmod +x /sysmon.sh
./sysmon.sh
mail
输入要查看的编号默认1
q:退出
如果没有邮件,说明脚本没有达到指定数值,把数值调小,再查看邮箱

设置crontab计划任务

(1)确认系统服务crond已经运行。

systemctl status crond

crond (pid  5839) 正在运行...

(2)添加crontab计划任务配置,每半小时调用一次sysmon.sh脚本程序。

1. crontab -e
2. 
3. */30 * * * * /root/sysmon.sh
目录
相关文章
|
运维 监控 应用服务中间件
【运维知识高级篇】34道Shell编程练习题及答案(从基础到实战:基础+计算+判断+循环+控制与数组+实战进阶)(二)
【运维知识高级篇】34道Shell编程练习题及答案(从基础到实战:基础+计算+判断+循环+控制与数组+实战进阶)(二)
912 0
|
运维 Shell Linux
【运维知识高级篇】34道Shell编程练习题及答案(从基础到实战:基础+计算+判断+循环+控制与数组+实战进阶)(一)
【运维知识高级篇】34道Shell编程练习题及答案(从基础到实战:基础+计算+判断+循环+控制与数组+实战进阶)
676 0
|
MySQL 关系型数据库 Shell
|
监控 Shell Apache
|
监控 关系型数据库 MySQL
|
Web App开发 关系型数据库 MySQL