条件测试
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多分支语句