Shell脚本编程(2)条件测试与if语句

Shell脚本(2)

实验材料centos7一台

条件测试操作

Shell环境根据命令执行后的返回状态($?)来判断是否执行成功,当返回值为0时表示成功,否侧(任何非0值)表示失败或异常,
使用专门的测试工具-test命令

1)文件测试
-d:测试是否为目录
-e:测试目录或文件是否存在
-f:测试是否为文件

例如,如下操作测试/media/是否为目录和是否存在
[root@CentOS7-02 ~]# [ -d /media/ ]
[root@CentOS7-02 ~]# echo $?
0 (表示存在而且是目录)
如下例子是测试不成返回其他非0值,如下可能不存在或不是目录
[root@CentOS7-02 ~]# [ -d /media/cdrom/Server ]
[root@CentOS7-02 ~]# echo $?
1
当然也可以使用echo语句加上&&更直观
&&:只要前面的命令成功执行后,后面的命令才会执行
[root@CentOS7-02 ~]# [ -d /media/cdrom/Server ] && echo"YES"
上述命令没有任何提示表示不是目录或不存在
[root@CentOS7-02 ~]# [ -d /media/cdrom/ ] && echo "YES"
YES
(表示存在而且是目录)

2)整数值比较
-eq:第一个数等于第二个数
-ne:第一个数不等于第二个数
-gt:第一个数大于第二个数
-lt:第一个小于第二个数
-le:第一个数小于或等于第二个数
-ge:第一个数大于或等于第二个数

例如如下例子
who | wc -l 显示当前登陆的用户数量,我这是一个
[root@CentOS7-02 ~]# w=who | wc -l 我这行显示成了代码你们要把who | wc -l 使用`` 括起来
[root@CentOS7-02 ~]# [ $w -gt 0 ] && echo "yes" (只要 $w值大于0就返回yes)
yes

又如,若要判断物理内存当前的磁盘缓存大小,低于1024MB时输出具体数值

[root@CentOS7-02 ~]# FreeCC=$(free -m | grep "Mem: " | awk'{print $6}')
free命令输出以MB单位内存信息,
你可以单独执行里面的命令看结果,上面这条命令的作用就是提取空闲内存大小
[root@CentOS7-02 ~]# [ $FreeCC -lt 1024 ] && echo ${FreeCC}MB
143MB我这里小于1024所以会显示出来)

3)字符串比较
主要用来检查用户输入的,系统环境是否满足条件,一般用于脚本中有交换操作,例如输入a显示一个内容
=:第一个字符串与第二个字符串相同
!=:第一个字符串与二个字符串不同,!表示区反
-z:检查字符串是否为空,
例如如下
[root@CentOS7-02 ~]# bbb=nihao
[root@CentOS7-02 ~]# [ $bbb !="123" ] && echo"no"
no
123就是一个字符串,白话就是字符
又例如
[root@CentOS7-02 ~]# read -p"是否覆盖现有文件(yes/no)?" ack (给ack赋值)
是否覆盖现有文件(yes/no)? yes (赋值为yes)
[root@CentOS7-02 ~]# [ $ack = "yes" ] && echo "覆盖"
覆盖

4)逻辑测试
逻辑测试指定是判断两个或多个条件之间的依赖关系,当系统任务却决于多个不同的条件时,根据这些条件是否同时成立或者只要有其中一个成立等情况,需要有一个测试过程
&&:逻辑与,只用当前后两个条件都成立时,整个测试命令返回值才为0
||:逻辑或,只要前后两个条件中有一个成立,整个测试命令返回值即为0
!:逻辑或:表示不,只有当指定条件不成立时,整个测试命令返回值才为0
[root@CentOS7-02 ~]# qqq=10
[root@CentOS7-02 ~]# www=20
[root@CentOS7-02 ~]# [ $qqq -gt 6 ] && [ $www -lt 50 ] && echo "符合"
符合

使用if语句

1)单分支if语句
单分支就是,条件成立时执行相应的代码,否则不执行任何操作
脚本如下
[root@CentOS7-02 ~]# vim if1.sh (看不懂的,我后面图片有解释)
#!/bin/bash
if [ "$USER" != "root" ]
then
echo "错误:非root用户,权限不足"
exit 1
fi
fdisk -l /dev/sda

在这里插入图片描述
[root@CentOS7-02 ~]# useradd lisi
[root@CentOS7-02 ~]# passwd lisi
[root@CentOS7-02 ~]# chmod 777root/ (我把脚本,协助了/root下,李四要权限)
[root@CentOS7-02 ~]# su lisi (切换到李四用户)
[lisi@CentOS7-02 root]$ sh /root/if1.sh
[lisi@CentOS7-02 root]$ sh /root/if1.sh
错误:非root用户,权限不足
断掉Xshell,重新使用root登陆,这里解释一下为什么不直接su root
因为系统中有缓存,$USER还是lisi

[root@CentOS7-02 ~]# sh if1.sh (然后会显示磁盘信息就对了)

2)双分支if语句应用
双分支语句只是在单分支语句的基础上针对"条件不成立“的情况执行另一种操作
[root@CentOS7-02 ~]# vim if2.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

[root@CentOS7-02 ~]# chmod +x if2.sh (因为脚本里有位置变量所以必须以./执行)
[root@CentOS7-02 ~]# ./if2.sh 192.168.100.102 (这个地址是我虚拟机本机地址)
HOST 192.168.100.102 is up
[root@CentOS7-02 ~]# ./if2.sh 192.168.100.45 (这个是瞎写的地址)
HOST 192.168.100.45 is down
在这里插入图片描述
还有一个脚本关于vsftpd的原理都一样我这里写一下,就不图片解释了
[root@CentOS7-02 ~]# vim ftp.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

[root@CentOS7-02 ~]# yum -y install vsftpd
[root@CentOS7-02 ~]# systemctl start vsftpd
[root@CentOS7-02 ~]# sh ftp.sh
监听地址::::21
进程PID号:1076

[root@CentOS7-02 ~]# systemctl stop vsftpd
[root@CentOS7-02 ~]# sh ftp.sh
“警告:vsftpd服务不可用”

3)多分支if语句应用
[root@CentOS7-02 ~]# vim cs.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

在这里插入图片描述
[root@CentOS7-02 ~]# sh cs.sh
请输入您的分数(0-100):100
100 分,优秀!
[root@CentOS7-02 ~]# sh cs.sh
请输入您的分数(0-100):84
84 分,合格
[root@CentOS7-02 ~]# sh cs.sh
请输入您的分数(0-100):69
69 分,不合格

实验完毕

发布了54 篇原创文章 · 获赞 57 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/weixin_45308292/article/details/100603272