条件测试与if语句用法

一、条件测试

1、test命令

要使shell脚本程序具备一定的"智能",面临的第一个问题就是如何区分不同的情况以确定执行何种操作。

例如,当磁盘使用率超过958l时,发送告警信息;当备份目录不存在时,能够自动创建:当源码编译程序时,若配置失败则不再继续安装等。

shell环境根据命令执行后的返回状态值($?)来判断是否执行成功,当返回值为0时表示成功,否则(非0值)表示失败或异常。

使用专门的测试工具———test 命令,可以对特定条件进行测试,并根据返回值来判断条件是否成立(返回值为0表示条件成立)。

2、文件测试

语法格式:

格式1:test 条件表达式
格式2[ 条件表达式 ]
#注意中括号和表达式中间需要隔一个空格或[ [条件表达式]]

文件测试指的是根据给定的路径名称,判断对应的是文件还是目录,或者判断文件是否
可读、可写、可执行等。文件测试的常见操作选项如下,使用时将测试对象放在操作选项之后即

[ 操作符 文件或目录 ]

常用的测试操作符

-d测试是否为目录(Directory)
-e测试目录或文件是否存在(Exist)
-f测试是否为文件(File)
-r测试当前用户是否有权限读取(Read)
-w测试当前用户是否有权限写入(Write)
-x测试当前用户是否有权限执行(eXcute)

例:判断文件类型是否正确
在这里插入图片描述

[root@node home]# [ -f /home/xxx ] && echo "他是一个目录不是文件"
[root@node home]# echo $?
[root@node home]# [ ! -e /home/chailin ] && mkdir /home/chailin
[root@node home]# ls

在这里插入图片描述
例:
成功打开目录输出?
在这里插入图片描述
在这里插入图片描述

vim demo7.sh
#1.定义变量
mount_dir="/data"

#2.判断有没有这个目录

if [ ! -d $mount_dir ];then
mkdir -p $mount_dir
fi

在这里插入图片描述

在这里插入图片描述

vim demo7.sh
read -p "请输入你的文件名: " file
if [ $file==*.sh ];then
echo "这是一个shell脚本"
fi
sh demo7.sh

在这里插入图片描述
在这里插入图片描述

3、整数值比较

 [ 整数1 操作数 整数2 ]      

常用的测试操作符

-eq等于(Equal)
-ne不等于(Not Equal)
-lt小于(Leser Than)
-gt大于(Greater Than)
-le小于或等于(Lesser or Equal)
-ge大于或等于(Greater or Equal)
[root@node ~]# vim demo6.sh
#!/bin/bash
if [ 8 -gt 5 ];then
echo "ok"
fi
[root@node ~]# sh demo6.sh

在这里插入图片描述
在这里插入图片描述

例:
判断用户数量

[root@node ~]# [ $(who|wc -l) -le 4 ] && echo "用户太少"
用户太少
[root@node ~]# [ $(who|wc -l) -le 1 ] && echo "用户太少"
[root@node ~]# echo $?
1
[root@node ~]# [ $(who|wc -l) -ge 1 ] && echo "用户太多"
用户太多
[root@node ~]# [ $(who|wc -l) -ge 4 ] && echo "用户太多"
[root@node ~]# echo $?
1

在这里插入图片描述

例:
查询机器内存

[root@node ~]# free -m
              total        used        free      shared  buff/cache   available
Mem:           3771         757         262          73        2751        2616
Swap:          3999           0        3999
[root@node ~]# free -m | grep "Mem:" | awk '{print $4}'
262
[root@node ~]# abc=$(free -m | grep "Mem:" | awk '{print $4}')
[root@node ~]# echo $abc
262
[root@node ~]# [ $abc -lt 1024 ] && echo "$abc"Mb
262Mb
[root@node ~]# free -m | grep "Mem: "
Mem:           3771         756         262          73        2751        2616
[root@node ~]# free -m | grep "Mem: " | awk '{print $6}'
2751
[root@node ~]# [ $abc -le 1024 ] && echo "内存资源不足,请尽快清理"
内存资源不足,请尽快清理

在这里插入图片描述

4、字符串比较

格式1 [ 字符串1 = 字符串2 ]
     [ 字符串1 != 字符串2 ] 

格式2 [ -z 字符串 ]

常用的测试操作符

=字符串内容相同
!=字符串内容不同,!号表示相反的意思
-z字符串内容为空
[root@node ~]# echo $LANG
zh_CN.UTF-8
[root@node ~]# [ $LANG  = zh_CN.UTF-8 ] && echo '当前系统字符集是中文UTF-8'
当前系统字符集是中文UTF-8
[root@node ~]# cp /etc/passwd ./
cp:是否覆盖"./passwd"[root@node ~]# read -p"是否覆盖现有文件(yes/no)?" ACK
是否覆盖现有文件(yes/no)?yes

在这里插入图片描述
在这里插入图片描述

5、逻辑测试

格式1[ 表达式1 ] 操作符 [ 表达式2 ]
格式2:命令1 操作符 命令2

常用的测试操作符

-a或&&逻辑与,而且的意思
-o或▕▕逻辑或,或者的意思
逻辑否

且或例子:
在这里插入图片描述

在这里插入图片描述

二、if语句的结构

1、单分支结构

if     条件测试操作               
  then 命令序列     
fi  						

在这里插入图片描述

例:查看mount_dir 是否是一个目录,如果不是就创建一个
在这里插入图片描述
在这里插入图片描述
例2:
判断用户输入的文件是否是脚本
在这里插入图片描述
在这里插入图片描述

2、双分支结构

if 条件测试操作 
   then              
   命令序列 1    
   else             
   命令序列 2   
fi               

例1:
判断网络连接开启状态否向正常
在这里插入图片描述

在这里插入图片描述
例2:
输入你需要创建的用户,如果有该用户,那么显示已经存在,若没有创建并赋予123456为密码。

在这里插入图片描述

在这里插入图片描述

3、多分支结构

if 条件测试操作
   then             
   命令序列1    
elif                  
条件测试操作2 
   then              
   命令序列2    
else             
命令序列3    
fi

例:

判断文件类别需求
在这里插入图片描述
在这里插入图片描述

三、case语句的结构

case多分枝结构

case 变量值 in 
模式一)
   命令序列
;;
模式二)
   命令序列 
;;
……
*)
   默认命令序列
esac

例:
根据学生成绩罚抄题目案例
在这里插入图片描述

在这里插入图片描述

总结

• 条件测试的语法
文件测试、整数值比较、字符串比较、逻辑测试

• if条件语句的语法
单分支、双分支、多分支

• case多分支语句的语法


版权声明:本文为weixin_44841019原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。