shell之条件判断
目录
一、条件判断语法结构
1.1 条件判断语法格式
- 格式1:test 条件表达式
- 格式2: [ 条件表达式 ]
- 格式3: [[ 条件表达式 ]]
注意:如何使用格式2或格式3,条件表达式两侧必须有空格!
1.2 条件判断相关参数
1)判断文件类型
判断参数 | 含义 |
---|---|
-e | 判断文件是否存在(任何类型文件) |
-f | 判断文件是否存在并且是一个普通文件 |
-d | 判断文件是否存在并且是一个目录 |
-L | 判断文件是否存在并且是一个软连接文件 |
-b | 判断文件是否存在并且是一个块设备文件 |
-S | 判断文件是否存在并且是一个套接字文件 |
-c | 判断文件是否存在并且是一个字符设备文件 |
-p | 判断文件是否存在并且是一个命名管道文件 |
-s | 判断文件是否存在并且是一个非空文件(有内容) |
举例:
$ test -e file;echo $? 只要文件存在条件为真
$ [ -d /shell01/dir1 ];echo $? 判断目录是否存在,存在条件为真
$ [ ! -d /shell01/dir1 ];echo $? 判断目录是否存在,不存在条件为真
$ [[ -f /shell01/1.sh ]];echo $? 判断文件是否存在,并且是一个普通的文件
2)判断文件权限
判断参数 | 含义 |
---|---|
-r | 当前用户对其是否可读 |
-w | 当前用户对其是否可写 |
-x | 当前用户对其是否可执行 |
-u | 是否有suid,高级权限冒险位 |
-g | 是否sgid,高级权限强制位 |
-k | 是否有t位,高级权限粘滞位 |
3)判断文件新旧
判断参数 | 含义 |
---|---|
file1 -nt file2 | 比较file1是否比file2新 |
file1 -ot file2 | 比较file1是否比file2旧 |
file1 -ef file2 | 比较是否为同一个文件,或者用于判断硬连接,是否指向同一个inode |
说明:这里的新旧指的是文件的修改时间!
4)判断整数
判断参数 | 含义 |
---|---|
-eq | 相等 |
-ne | 不等 |
-gt | 大于 |
-lt | 小于 |
-ge | 大于等于 |
-le | 小于等于 |
5)判断字符串
判断参数 | 含义 |
---|---|
-z | 判断是否为空字符串,字符串长度为0则成立 |
-n | 判断是否为非空字符串,字符串长度不为0则成立 |
string1 = string2 | 判断字符串是否相等 |
string1 != string2 | 判断字符串是否相不等 |
6)多重条件判断
判断符号 | 含义 | 举例 |
---|---|---|
-a 和 && | 逻辑与 | [ 1 -eq 1 -a 1 -ne 0 ] [ 1 -eq 1 ] && [ 1 -ne 0 ] |
-o 和 || | 逻辑或 | [ 1 -eq 1 -o 1 -ne 1 ] |
说明:
- &&:前面的表达式为真,才会执行后面的代码;
- ||:前面的表达式为假,才会执行后面的代码;
- ;:只用于分割命令或表达式;
举例:
- 数值比较
$ [ $(id -u) -eq 0 ] && echo "the user is admin"
[root@localhost ~]$ [ $(id -u) -ne 0 ] && echo "the user is not admin"
[root@localhost ~]$ [ $(id -u) -eq 0 ] && echo "the user is admin" || echo "the user is not admin"
- 类c风格的数值比较
注意:在(( ))中,=表示赋值;==表示判断
$ ((1==2));echo $?
$ ((1<2));echo $?
$ ((2>=1));echo $?
$ ((2!=1));echo $?
$ ((`id -u`==0));echo $?
$ ((a=123));echo $a
$ ((a==123));echo $?
- 字符串比较
$ a=hello;b=world
$ [ $a = $b ];echo $?
$ [ "$a" = "$b" ];echo $?
$ [ "$a" != "$b" ];echo $?
$ [ "$a" == "$b" ];echo $?
逻辑运算符总结
1)符号;和&&和||都可以用来分割命令或者表达式;
2)分号(;)完全不考虑前面的语句是否正确执行,都会执行;号后面的内容;
3)&&符号,需要考虑&&前面的语句的正确性,前面语句正确执行才会执行&&后的内容;反之亦然;
4)||符号,需要考虑||前面的语句的非正确性,前面语句执行错误才会执行||后内容;反之亦然;
5)如果&&和||一起出现,从左往右依次看,按照以上原则;
二、流程控制语句
2.1 基本语法结构
1)单分支if结构
if 条件测试操作
then
命令序列
fi
2)双分支if结构
if 条件测试操作
then
命令序列
else
命令序列
fi
3)多分支if结构
if 条件测试操作1
then
命令序列1
elif 条件测试操作2
then
命令序列2
else
命令序列3
fi
4)多层嵌套if结构
if 条件测试操作1
then
命令序列1
if 条件测试操作2
then
命令序列2
fi
else
if 条件测试操作3
then
命令序列3
elif 条件测试4
then
命令序列4
else
命令序列5
fi
fi
2.2 应用示例
1)判断两台主机是否可以通信
#!/bin/bash
# 交互式定义变量,让用户自己决定ping哪个主机
read -p "请输入你要ping的主机的IP:" ip
# 使用ping程序判断主机是否互通
ping -c1 $ip &>/dev/null
if [ $? -eq 0 ];then
echo "当前主机和远程主机$ip是互通的"
else
echo "当前主机和远程主机$ip不通的"
fi
2)判断一个进程是否存在
#!/bin/bash
# 判断一个程序(httpd)的进程是否存在
pgrep httpd &>/dev/null
if [ $? -ne 0 ];then
echo "当前httpd进程不存在"
else
echo "当前httpd进程存在"
fi
pgrep命令:以名称为依据从运行进程队列中查找进程,并显示查找到的进程id!
选项:
-o:仅显示找到的最小(起始)进程号;
-n:仅显示找到的最大(结束)进程号;
-l:显示进程名称;
-P:指定父进程号;pgrep -p 4764 查看父进程下的子进程id
-g:指定进程组;
-t:指定开启进程的终端;
-u:指定进程的有效用户ID。
3)判断一个服务是否正常
#!/bin/bash
#定义变量
web_server=www.baidu.com
#访问网站
wget -P /shell/ $web_server &>/dev/null
[ $? -eq 0 ] && echo "当前网站服务是ok" && rm -f /shell/index.* || echo "当前网站>服务不ok,请立刻处理"
*************** 当你发现自己的才华撑不起野心时,就请安静下来学习吧!***************