shell编程之条件语句

条件测试

test命令

测试表达式是否成立,若成立返回0,否则返回其他数值令
格式1: test 条件表达式

[root@server6 ~]# touch a
[root@server6 ~]# test -f a
[root@server6 ~]# echo $?
0
[root@server6 ~]#

格式2:[条件表达式]

[root@server6 ~]# [ -f a ] 
[root@server6 ~]# echo $?
0
[root@server6 ~]#

#文件测试

[操作符 文件或目录】

常用的测试操作符
-d:测试是否为目录(Directory)

[root@server6 ~]# test -d a
[root@server6 ~]# echo $?
1
[root@server6 ~]#

-e:测试目录或文件是否存在(Exist)

[root@server6 ~]# test -e a
[root@server6 ~]# echo $?
0
[root@server6 ~]# 

-f:测试是否为文件(File)

[root@server6 ~]# touch a
[root@server6 ~]# test -f a
[root@server6 ~]# echo $?
0
[root@server6 ~]#

-r:测试当前用户是否有权限读取(Read)

[root@server6 ~]# test -r a
[root@server6 ~]# echo $?
0
[root@server6 ~]# 

-w:测试当前用户是否有权限写入(Write)

[root@server6 ~]# test -w a
[root@server6 ~]# echo $?
0
[root@server6 ~]# 

-x:测试当前用户是否有权限执行(eXcute)

[root@server6 ~]# test -x a
[root@server6 ~]# echo $?
1
[root@server6 ~]# 
[root@server6 ~]# mkdir /media/cdrom
[root@server6 ~]# [ -d /media/cdrom ]
[root@server6 ~]# echo $?
0--------------------------------------------返回0表示条件成立
[root@server6 ~]# [ -d /media/cdrom/Server ]
[root@server6 ~]# echo $?
1--------------------------------------------返回1表示条件不成立
[root@server6 ~]# [ -d /media/cdrom ] && echo "YES"
YES-----------------------------------------逻辑与  而且的意思
[root@server6 ~]# 

整数值比较

[整数1 操作符 整数2]

[root@server6 ~]# who 
root     :0           2020-11-03 14:08 (:0)
root     pts/0        2020-11-04 18:18 (192.168.188.1)
[root@server6 ~]# who | wc -l
2
[root@server6 ~]# [ $(who | wc -l) -ge 5 ] && echo "too many"
[root@server6 ~]# [ $(who | wc -l) -le 5 ] && echo "too many"
too many
[root@server6 ~]# 
[root@server6 ~]# [ $(free -m | grep Mem: | awk '{print $7}') -ge 1024 ] && echo  "内存可用空间:$(free -m | grep Mem: | awk '{print $7}')"
内存可用空间:2661
[root@server6 ~]# 

常用的测试操作符
-eq:等于(Equal)
-ne:不等于(Not Equal)
-gt:大于(Greater Than)
-lt:小于(Lesser Than)
-le:小于或等于(Lesser or Equal)
-ge:大于或等于(Greater or Equal)

需要前面的条件成立 才能输出

[root@server6 ~]# [ 1 -gt 2 ] && echo "tree"
[root@server6 ~]# [ 1 -lt 2 ] && echo "tree"
tree
[root@server6 ~]# 

字符串比较

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

[root@server6 ~]# [ 'a' = 'b' ]
[root@server6 ~]# echo $?
1
[root@server6 ~]# [ 'a' = 'b' ] && echo "a不等于b"
[root@server6 ~]# 

[root@server6 ~]# [ 'a' != 'b' ] && echo "a不等于b"
a不等于b
[root@server6 ~]# 

格式2:
[ -z 字符串 ]

[root@server6 ~]# [ -z '' ] && echo "空格"
空格
[root@server6 ~]# 

常用的测试操作符
=:字符串内容相同
!=:字符串内容不同,!号表示相反的意思
-z:字符串内容为空

[root@server6 ~]# read -p "是否覆盖现有内容?(yes/no)" ack
是否覆盖现有内容?(yes/no)yes
[root@server6 ~]# [ $ack="yes" ] && echo "覆盖"
覆盖
[root@server6 ~]# 

逻辑测试

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

常用的测试操作符

-a或&&:逻辑与,“而且”的意思
-o或||:逻辑或,“或者”的意思
!:逻辑否

if语句的结构

单分支结构

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

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


[root@server6 ~]# vi mkdir.sh
#!/bin/bash
# 创建目录
dir="/a/b"
if [ ! -d $dir ]
then mkdir -p $dir
fi

[root@server6 ~]# chmod +x mkdir.sh 
[root@server6 ~]# ./mkdir.sh 
[root@server6 ~]# su sf
[sf@server6 root]$ sudo vi a.sh
#!/bin/bash
# 判断用户是否为root
if [ ! '$USER' = 'root' ]]
then echo "当前用户不是root"
fi

[sf@server6 root]$ sudo chmod +x a.sh
[sf@server6 root]$ sudo ./a.sh
当前用户不是root
[sf@server6 root]$ 

双分支结构

在这里插入图片描述
在这里插入图片描述
判断apache是否启动中

[root@server6 ~]# vi a1.sh

#!/bin/bash
# 判断apache是否启动中
netstat -anpt | grep 80
if [ $? = 0 ]
then echo "网站服务启动中"
else echo "网站服务停止"
fi

[root@server6 ~]# chmod +x a1.sh 
[root@server6 ~]# ./a1.sh 
网站服务停止

双分支if语句只是在单分支的基础上针对“条件不成立”的情况执行另一种操作,而不是“坐视不管”地不执行任何操作。

例如,若要编写一个连通性测试脚本 pinghost.sh,通过位置参数$1提供自标主机地址,然后根据ping检测结果给出相应的提示,可以参考以下操作过程。
ping

[root@server6 ~]# vi ping.sh 

#!/bin/bash
# 查看是否能ping通
ping -c 3 $1 &> /dev/null
if [ $? = 0 ]
then echo "ping通了"
else
echo "ping不通"
fi
[root@server6 ~]# chmod +x ping.sh 
[root@server6 ~]# ./ping.sh 192.168.188.60
ping通了
[root@server6 ~]#

天气

[root@server6 ~]# vi tiangi.sh

#!/bin/bash
# 天气
read -p "天气" weather
if [ "$weather" = "天晴" ]
then echo "好天气"
else
echo "今天可能要带伞"
fi
[root@server6 ~]# chmod +x tiangi.sh 
[root@server6 ~]# ./tiangi.sh 
天气天晴
好天气
[root@server6 ~]# 

多分支结构

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

[root@server6 ~]# vi grade.sh
#!/bin/bash
# 成绩判断
read -p "您的成绩是:" grade
if [ $grade -gt 100 ] || [ $grade -lt 0 ]
then echo "输入错误,请重新输入0~100间数值"
elif [ $grade -ge 85 ] && [ $grade -le 100 ]
then echo "优秀!!"
elif [ $grade -ge 70 ] && [ $grade -le 84 ]
then echo "良好!!"
elif [ $grade -ge 60 ] && [ $grade -le 69 ]
then echo "合格!!!"
else echo "不合格!!"
fi
[root@server6 ~]# chmod +x grade.sh 
[root@server6 ~]# ./grade.sh 
您的成绩是:95
优秀!!
[root@server6 ~]# ./grade.sh 
您的成绩是:101
输入错误,请重新输入0~100间数值
[root@server6 ~]# ./grade.sh 
您的成绩是:88
优秀!!
[root@server6 ~]# ./grade.sh 
您的成绩是:77
良好!!
[root@server6 ~]# ./grade.sh 
您的成绩是:59
不合格!!
[root@server6 ~]# 

case多分支语句

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值