条件测试
- test命令
测试表达式是否成立,若成立返回0,否则返回其他其他数值
格式1:test 条件表达式
格式2:[ 条件表达式 ]
文件测试与整数测试
- 文件测试
[ 操作符 文件或者目录 ]
- 常用的测试操作符
-d: 测试是否为目录(Directory)
-e: 测试目录或文件是否存在(Exist)
-f: 测试是否为文件(File)
-r: 测试当前用户是否有权限读取(Read)
-W:测试当前用户是否有权限写入(Write)
-X: 测试当前用户是否有权限执行(eXcute)
[root@localhost ~]# [ -d /media/cdrom ]
[root@localhost ~]# echo $?
1 #返回1表示条件不成立
[root@localhost ~]# [ -d /opt/ ]
[root@localhost ~]# echo $?
0 #返回0表示条件成立
[root@localhost ~]# [ -d /opt/ ]&& echo "yes" #&&逻辑与,而且的意思
yes
- 条件测试
整数值比较
整数1 操作符 整数2
常用的测试操作符
-eq: 等于(Equal)
-ne: 不等于(Not Equal)
-gt: 大于(Greater Than)
-lt: 小于(Lesser Than)
-le: 小于或等于(Lesser or Equal)
-ge: 大于或等于(Greater or Equal)
[root@localhost ~]# [ 55 -lt 80 ] && echo "yes" #55小于80 yes
yes
- 字符串比较
格式1 :[ 字符串1 = 字符串2 ]
[ 字符串1 != 字符串2 ]
格式2: [ -z 字符串 ]
常用的测试操作符
=:字符串内容相同
!=:字符串内容不同,!号表示相反的意思
-z:字符串内容为空
[root@localhost ~]# echo $LANG
zh_CN.UTF-8
[root@localhost ~]# [ $LANG != "EN" ]&&echo "no"
no
[root@localhost ~]# read -p "是否覆盖现有文件(yes/no)?" ACK
是否覆盖现有文件(yes/n)?yes
[root@localhost ~]# [ $ACK = "yes" ] && echo "覆盖" #测试读入的字符串是否为yes
覆盖
逻辑测试
格式1:[ 表达式1 ] 操作符 [ 表达式2 ]....
格式2:命令1 操作符 命令2 ...
常用的测试操作符
-a或&&:逻辑与,"而且"的意思
-o或|:逻辑或,“或者”的意思
!:逻辑否
[root@localhost ~]# [ -d /etc/ ] && [ -r /etc/ ]&& echo "yes"
yes
if语句
if单分支语句
单分支结构(基本格式)
if 条件测试操作
then 命令序列
fi
单分支结构(举例)
if 磁盘已用空间>80%
then 报警
fi
[root@localhost ~]# vim 111.sh
#!/bin/bash
read -p "请输入目录位置:" AAA
if [ ! -d $AAA ] #当目录不存在是进行
then
mkdir -p $AAA #创建输入的目录
fi
[root@localhost ~]# . 111.sh
请输入目录位置:QQ
[root@localhost ~]# ls
111.sh anaconda-ks.cfg QQ
if双分支语句
双分支结构(基本格式)
if 条件测试操作
then 命令序列1
else 命令序列2
fi
双分支结构(举例)
if 80端口是否在监听
then 网站服务已在运行
else 启动httpd服务
fi
判断目标主机是否存活,显示检测结果
[root@localhost opt]# vim 1111.sh
#!/bin/bash
read -p "请输入IP地址" A
ping -c 3 -i 0.2 -W 3 $A &> /dev/null #-c -i -W 选项分别指定只发送三个测试包、间隔0.2秒、超时三秒
if [ $? -eq 0 ]
then
echo "host $A is up."
else
echo "host $A is down."
fi
[root@localhost opt]# . 1111.sh
请输入IP地址10.0.0.1
host 10.0.0.1 is down. #判断ping命令的检测结果,分别给出不同提示
[root@localhost opt]# . 1111.sh
请输入IP地址192.168.100.1
host 192.168.100.1 is up.
if多分支语句
多分支结构(基本格式)
if 条件测试操作1
then 命令序列1
elif 条件测试操作2
then 命令序列2
else
命令序列3
fi
多分支结构(举例)
if 分数为85~100之间
then 判为优秀
elif 分数为70~84之间
then 判为合格
else
判为不合格
fi
[root@localhost opt]# vim abc.sh
#!bin/bash
read -p "请输入成绩:" score
if [ $score -ge 85 ] && [ $score -le 100 ]
then
echo "成绩优秀"
elif [ $score -ge 70 ] && [ $score -le 84 ]
then
echo "成绩合格"
else echo "请重修"
fi
[root@localhost opt]# . abc.sh
请输入成绩:85 #判断分数所在区间,给出不同的分档结果
成绩优秀
root@localhost opt]# . abc.sh
请输入成绩:74
成绩合格
[root@localhost opt]# . abc.sh
请输入成绩:4
请重修
case分支语句
针对变量的不同取值,分别执行不同的命令序列
这种情况与多分支的if语句非常相似,只不过if语句需要判断多个不同的条件,而case语句指示判断一个变量的不同取值
格式:
case 变量值 in
模式1)
命令序列1
;;
模式2)
命令序列2
;;
....
*)
默认命令序列
esac
————————————————————
实例:
case 控制指令 in
start)
启动XX服务
;;
stop)
停止XX服务
;;
....
*)
显示服务脚本的用法
esac
[root@localhost opt]# vim panduan.sh
#!/bin/bash
read -p "请输入一个字符:" aa
case "$aa" in
[0-9]) #匹配任意数字
echo "你输入的是数字"
;;
[a-z]|[A-Z]) #匹配任意字母
echo "你输入的是字母"
;;
*) #匹配任意符号
echo "你输入的是符号"
esac
~
[root@localhost opt]# chmod +x panduan.sh
[root@localhost opt]# ./panduan.sh
请输入一个字符:3
你输入的是数字
[root@localhost opt]# ./panduan.sh
请输入一个字符:e
你输入的是字母
[root@localhost opt]# ./panduan.sh
请输入一个字符:#
你输入的是符号