目录
一. 条件判断的语法格式
- 格式1:test 条件表达式
- 格式2:[ 条件表达式 ]
- 格式3:[[ 条件表达式 ]] 支持正则 =~
特别说明:
1)[ 我两边都有空格,不空打死你喔 ]
2)[[ 我两边都有空格,不空打死你喔 ]]
3)更多判断,man test 去查看,很多的参数都用来进行条件判断
二. 条件判断的相关参数
2.1 判断文件类型
判断参数 | 含义 |
---|---|
-e | 判断文件是否存在(任何类型文件) |
-f | 判断文件是否存在并且是一个普通文件 |
-d | 判断文件是否存在并且是一个目录 |
-L | 判断文件是否存在并且是一个软连接文件 |
-b | 判断文件是否存在并且是一个块设备文件 |
-S | 判断文件是否存在并且是一个套接字文件 |
-c | 判断文件是否存在并且是一个字符设备文件 |
-p | 判断文件是否存在并且是一个命名管道文件 |
-s | 判断文件是否存在并且是一个非空文件(有内容) |
举例说明:
test -e file #只要文件存在条件为真
[ -d /opt/peihua ] #判断目录是否存在,存在条件为真
[ ! -d /opt/peihua ] #判断目录是否存在,不存在条件为真
[[ -f /opt/1.txt ]] #判断文件是否存在,并且是一个普通文件
2.2 判断文件权限
判断参数 | 含义 |
---|---|
-r | 当前用户对其是否可读 |
-w | 当前用户对其是否可写 |
-x | 当前用户对其是否可执行 |
2.3 判断文件新旧
说明:这里的新旧指的是文件修改时间。
判断参数 | 含义 |
---|---|
file1 -nt file 2 | 比较file1是否比file2 新 |
file1 -ot file2 | 比较file1 是否比file2 旧 |
file1 -ef file2 | 比较是否为同一文件,或者用于判断硬链接,是否指向同一个inode |
2.4 判断整数
判断参数 | 含义 |
---|---|
-eq | 相等 |
-ne | 不相等 |
-gt | 大于 |
-lt | 小于 |
-ge | 大于等于 |
-le | 小于等于 |
2.5 判断字符串
判断参数 | 含义 |
---|---|
-z | 判断是否为空字符串,字符串长度为0则成立 |
-n | 判断是否为非空字符串,字符串长度不为0则成立 |
string1 = string2 | 判断字符串是否相等 |
string1 != string2 | 判断字符串是否不相等 |
注意:字符串的比较是需要在符号的两边空格的,否则会不会起到比较的作用
[root@localhost ppeihua]# a=hello;b=word;[ $a=$b ];echo $?
0
[root@localhost ppeihua]# a=hello;b=word;[ $a = $b ];echo $?
1
2.6 多种条件判断
判断符号 | 含义 | 举例 |
---|---|---|
-a 和 && | 逻辑与 | [ 1 -eq 1 -a 1 -ne 0] [1 -eq 1] && [ 1 -ne 0 ] |
-o 和 || | 逻辑或 | [ 1 -eq 1 -o 1 -ne 1 ] [ 1-eq 1 ] || [1 -ne 1 ] |
特别说明:
1)&& 前面表达式为真,才会执行后面的代码
2)|| 前面的表达式为假,才会执行后面的代码
3); 只用于分隔命令或表达式。完全不用考虑;号前面的语句是否正确执行,都会执行;号后面的内容
4)如果&&和||一起出现,从左往右依次看,按照以上原则
三. 流程控制语句
3.1 if单分支语句
if [ 条件测试操作 ]
then 命令序列
fi
if单分支的流程图
3.2 if双分支语句
if [ 条件测试操作 ]
then
命令序列1
else
命令序列2
fi
if双分支流程图
3.3 if多分支语句
if [ 条件测试操作1 ]
then
命令序列1
elif [ 条件测试操作2 ]
then
命令序列2
else
命令序列3
fi
if多分支流程图
四. if判断语句应用案例
4.1 判断两台主机是否和远程主机是否ping通
需求:判断当前主机是否和远程主机是否ping通
1.思路
1)使用哪个命令实现 (ping;-t;-w;)
2)根据命令的执行结果来判断是否通
3)根据逻辑和语法结构来编写脚本(条件判断或者流程控制)
2.落地实现
#!/bin/bash
#该脚本用于判断当前主机是否和远程指定主机互通
#交互式定义变量,让用户自己决定ping哪个主机
read -p "请输入你要ping的主机的IP:" IP
#使用Ping程序判断主机是否互通
ping -c 1 $IP &> /dev/null
if [ $? -eq 0 ];then
echo "当前主机与远程主机$IP是互通的"
else
echo "当前主机与远程主机$IP是不互通的"
fi
~
4.2 判断一个服务是否正常
需求:判断门户网站是否能够正常访问
1.思路
1)可以判断进程是否存在,用/etc/init.d/http status判断状态等方法
2)最好的方法是直接去访问一下,通过访问是否成功和失败的返回值来判断 (wget)
2.落地实现
#!/bin/bash
#判断门户网站是否正常提供服务
#定义变量
web_server=www.baidu.com
wget -P /opt/zhenguo $web_server &> /dev/null
[ $? -eq 0 ] && echo "当前网站服务是ok的" && rm -f /opt/zhenguo/index.* || echo "当前网站服务不ok,请立刻处理"