条件测试以及if,case语句
Posted 老张学coding
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了条件测试以及if,case语句相关的知识,希望对你有一定的参考价值。
一、条件测试
Shell环境==根据命令执行后的返回状态值($?)==来判断是否执行成功,当返回值为0(真true)表示命令或者阿胶本执行成功,返回值为非0值(假flase)时表示失败或异常
1.1、test命令
功能:可以对特定条件进行测试,根据返回值来判断条件是否成功
格式:
格式一:test 条件表达式
格式二:[ 条件表达式 ] #方括号与条件表达式之间左右两边至少需要一个空格隔开
test判断:
方括号判断:
1.2、文件测试与整数测试
1.2.1、文件测试
格式:
[ 操作符 文件或目录 ]
文件测试中常用的测试操作符
-d | 测试是否为目录(Directory) |
---|---|
-e | 测试目录或者文件是否存在(Exist) |
-f | 测试是否为文件(File) |
-r | 测试当前用户是否有读取权限 |
-w | 测试当前用户是否有写入权限 |
-x | 测试当前用户是否有执行权限 |
-L | 测试是否为符号链接 |
-
-d,-f,-e演示
-
-r,-w,-x文件权限判断演示
注意:不能能同时判断权限
- -L软链接判断
1.2.2、整数值比较
格式:
[ 整数1 操作符 整数2 ]
整数值比较中常用的测试操作符
-eq | 等于 |
---|---|
-ne | 不等于 |
-gt | 大于 |
-lt | 小于 |
-le | 小于或等于 |
-ge | 大于或等于 |
- 演示:直接用数值
- 演示:用变量
- 用双括号进行比较(可以用符号进行操作)
[root@localhost data]# ((4>5))
[root@localhost data]# echo $?
1
[root@localhost data]# ((4<5))
[root@localhost data]# echo $?
0
[root@localhost data]# [[ 4/<5 ]]
[root@localhost data]# echo $?
0
[root@localhost data]# [[ 4/>5 ]]
[root@localhost data]# echo $?
1
补充1:用who|wc -l查看用户数量
格式:
[root@localhost data]# [ $(who |wc -l) -lt 5 ] && echo "few"
few
补充2:用FreeCC查看内存使用情况
格式:
[root@localhost data]# free -m
total used free shared buff/cache available
Mem: 1984 727 90 9 1165 996
Swap: 3 0 3
[root@localhost data]# free -m| grep "Mem:"
Mem: 1984 727 90 9 1165 996
[root@localhost data]# free -m | grep 'Mem:' |awk '{print $4}'
90
[root@localhost data]# freecc='free -m | grep 'Mem:' |awk '{print $4}''
bash: }: 未找到命令...
[root@localhost data]# freecc=`free -m | grep 'Mem:' |awk '{print $4}'`
[root@localhost data]# echo $freecc
90
[root@localhost data]# [ $freecc -lt 100 ] && echo "警告:当前内存仅有${freecc}MB,低于警戒值100MB!!"
警告:当前内存仅有90MB,低于警戒值100MB!!
[root@localhost data]#
1.3、字符串测试与逻辑测试
1.3.1、字符串测试
格式:
格式一:
[ 字符串1 = 字符串2 ]
[ 字符串1 != 字符串2 ]
格式二:
[ -z 字符串 ]
常用操作符:
= | 字符串内容相同 |
---|---|
!= | 字符串内容不同,!表示取反的意思 |
-z | 字符串内容为空 |
-n | 检查是否有字符串存在 |
操作:=,!=测试
操作:-z判断是否为空字符串
操作:测试当前语言环境
1.3.2、逻辑测试
格式:
格式一:[ 表达式1 ] 操作符 [ 表达式2 ]
格式二:命令1 操作符 命令2 。。。
常用的测试操作符:
-a或&& | 逻辑与,“而且“的意思 |
---|---|
-o或|| | 逻辑与,”或者“的意思 |
! | 逻辑否 |
- 括号中用符号操作符&&
注意:文字操作符(在括号里)用单方括号即可,符号操作符(在括号里)用双方括号
ping主机shell测试:
代码:
#!/bin/bash
#发送三个包,每个包间隔时间,ping2秒停止
ping -c 3 -i 0.5 -w 2 $1 &> /dev/null && echo "$1 is online!" || echo "$1 is off"
批量ping主机:
不用循环无法进行批量ping主机
二、if语句
2.1、if单分支语句
以磁盘占用为例:
[root@localhost /]# total=`df |grep sda3 |awk '{print $2}'`
[root@localhost /]# used=`df | grep sda3 |awk '{print $3}'`
[root@localhost /]# echo $total $used
62366976 9626148
#!/bin/bash
total=`df |grep sda3 |awk '{print $2}'`
used=`df | grep sda3 |awk '{print $3}'`
percent=$(echo "scale=2;$used / $total * 100 "|bc | awk -F '.' '{print $1}')
if [ $percent -ge 14 ]
then
echo "警告!磁盘空间不足!!${percent}%" #用%号,看起来更美观
fi
2.2、if双分支语句
#!/bin/bash
netstat -natp | grep :80 &> /dev/null
if [ $? -eq 0 ];then
echo "http服务正常运行"
else
echo "http服务未开启,正在开启服务 。。。。"
systemctl start httpd && echo "服务开启成功"
fi
2.3、if多分支语句
格式:
if 条件测试操作1
then cmd1
elif 条件测试操作1
then cmd2
else
cmd3
fi
案例:判断成绩优秀程度
要求:
#!/bin/bash
read -p "请输入你的成绩(0-100):" score
if [[ $score -eq 100 ]];then
echo "满分,你真优秀"
elif [ $score -ge 90 ] && [ $score -le 99 ];then
echo "再接再厉,错误抄写10遍 "
elif [ $score -ge 70 ] && [ $score -le 89 ];then
echo "抄20遍"
elif [[ $score -gt 59 && $score -lt 70 ]];then
echo "错题30遍"
elif [[ $score -lt 60 && $score -ge 0 ]];then
echo "全抄30遍"
else
echo "输入有误,请重新输入"
fi
案例:判断目录是否存在(不存在则为true,接着下面的命令),如果不存在就新建一个目录
代码:
[ ! -d test ] && mkdir test
[ -d test123 ] || mkdir test123
三、case语句
3.1、case多分支结构
格式:
case 变量值 in
模式1)
命令序列1
;;
模式2)
命令序列2;
;;
*)
默认命令序列
esac
案例:将上面的成绩优秀程度用case表示
代码:
#!/bin/bash
read -p "请输入你的分数(0-100):" score
[ $score -ge 90 -a $score -le 100 ] && a="great"
[ $score -ge 70 -a $score -le 89 ] && a="medium"
[ $score -ge 60 -a $score -le 69 ] && a="pass"
[ $score -lt 60 -a $score -ge 0 ] && a="unpass"
case $a in
great)
echo "$score分,秀儿"
;;
medium)
echo "$score分,soso"
;;
pass)
echo "$score分,just soso"
;;
unpass)
echo "$score分,flase"
;;
*)
echo "输入有误"
esac
验证:
以上是关于条件测试以及if,case语句的主要内容,如果未能解决你的问题,请参考以下文章