Shell编程-05-Shell中条件测试与比较
Shell脚本条件测试
在Shell脚本中各种条件结构和流程控制结构中会存在各种判断比较,然后根据不同的判断结果执行不同的操作或命令,返回的结果通常为真或假。常见的条件测试如下所示:
- 条件测试-1
test <测试表达式>
利用test命令进行条件测试表达式,test命令和表达式中间至少有一个空格
- 条件测试-2
[ <测试表达式> ]
利用[]进行条件测试的方法,表达式与[]前后均需要有至少一个空格
- 条件测试-3
[[ <测试表达式> ]]
利用[ [ ] ]进行条件测试的方法,表达式与[ [ ] ]前后均需要有至少一个空格
- 条件测试-4
((<测试表达式>))
利用(())进行条件测试的方法,表达式与(())前后不需要有空格,一般用于if语句
以上几种用法的注意事项如下所示:
- 1、test命令和[]功能是等价的
- 2、[[]]是test命令的扩展
- 3、(())常用于计算
- 4、[[]]可以使用通配符进行模式匹配
- 5、&&、||、<、>等操作符可以用在[[]],但不能用在[]中,在[]中一般用-a、-o、-gt、-lt等进行代替
test条件测试
其基本语法如下所示:
test <测试表达式>
示例如下所示:
[root@localhost Test]# test -f para.sh && echo true || echo false
true
[root@localhost Test]# test -f para && echo true || echo false
false
以上命令用于测试文件是否为普通文件或文件是否存在,如果是则输出true,否则输出false
[]条件测试
其基本语法如下所示:
[ <测试表达式> ]
[]与test功能是等价的,即test的所有判断选项均可以直接在[]中使用。示例如下所示:
[root@localhost Test]# [ -f para.sh ] && echo true || echo false
true
[root@localhost Test]# [ -f para ] && echo true || echo false
false
以上注意表达式与[]间的空格
[[]]条件测试
其基本语法如下所示:
[[ <测试表达式> ]]
其示例如下所示:
[root@localhost Test]# [[ -f para.sh ]] && echo true || echo false
true
[root@localhost Test]# [[ -f para ]] && echo true || echo false
false
以上注意表达式与[[]]间的空格
- 1、以上几种用法,推荐采用[]写法,其他三种了解即可
- 2、如需查看更详细的用法,可以使用man 进行查看
Shell文件测试
常用文件测试表达式
如果在编写脚本时需要操作一个对象,需要先对对象进行测试,在满足条件后才会进行相应的操作或命令,从而避免程序出错和资源浪费。操作的对象通常为文件、字符串和数字等,常见的文件测试表达式如下所示:
| 文件操作符 | 英文含义 | 含义 |
|---|---|---|
| -b FILE | block | 文件存在且为块设备文件则为真 |
| -c FILE | character | 文件存在且为字符设备文件则为真 |
| -d FILE | directory | 文件夹存在则为真 |
| -f FILE | file | 文件存在且为普通文件则为真 |
| -e FILE | exist | 文件存在即为真,不区分文件或文件夹 |
| -L FILE | symbolic link | 文件存在且为链接文件则为真 |
| -O FILE | owner | 文件存在且属主有有效的UID则为真 |
| -G FILE | group | 文件存在且属组有有效的GID则为真 |
| -r FILE | read | 文件存在且具备可读权限则为真 |
| -s FILE | size | 文件存在且文件大小大于0则为真 |
| -w FILE | write | 文件存在且具备可写权限则为真 |
| -x FILE | executable | 文件存在且具备可执行权限则为真 |
| FILE1 -ef FILE2 | equal | FILE1和FILE2拥有同样的设备和inode number则为真 |
| FILE1 -nt FILE2 | new than | FILE1的修改日期比FILE2新则为真 |
| FILE1 -ot FILE2 | older than | FILE1的修改日期比FILE2旧则为真 |
以上更详细信息可使用命令man test进行查看。
文件测试表达式示例
[root@localhost Test]# [ -d ~/Test ] && echo true || echo false
true # 判断文件是否为文件夹
[root@localhost Test]# [ -e ~/Test/eval.sh ] && echo true || echo false
true # 判断文件是否存在
[root@localhost Test]# [ -e ~/Test/ ] && echo true || echo false
true # 判断文件是否存在
[root@localhost Test]# [ -O ~/Test/ ] && echo true || echo false
true # 判断文件是否存在且套上有效的UID
[root@localhost Test]# [ -G ~/Test/ ] && echo true || echo false
true # 判断文件是否存在且套上有效的GID
[root@localhost Test]# ll -d ~/Test/
drwxr-xr-x 2 root root 123 11月 1 17:47 /root/Test/ # 显示文件信息
[root@localhost Test]# [ -r ~/Test/ ] && echo true || echo false
true # 判断文件是否存在及可读权限
[root@localhost Test]# [ -w ~/Test/ ] && echo true || echo false
true # 判断文件是否存在及可写权限
[root@localhost Test]# [ -x ~/Test/ ] && echo true || echo false
true # 判断文件是否存在及可执行权限
[root@localhost Test]# stat eval.sh exec.sh
文件:"eval.sh"
大小:68 块:8 IO 块:4096 普通文件
设备:802h/2050d Inode:21590 硬链接:1
权限:(0644/-rw-r--r--) Uid:( 0/ root) Gid:( 0/ root)
最近访问:2018-11-01 17:32:31.559464328 +0800
最近更改:2018-11-01 17:32:19.712464490 +0800
最近改动:2018-11-01 17:32:19.713464490 +0800
创建时间:-
文件:"exec.sh"
大小:89 块:8 IO 块:4096 普通文件
设备:802h/2050d Inode:21589 硬链接:1
权限:(0644/-rw-r--r--) Uid:( 0/ root) Gid:( 0/ root)
最近访问:2018-11-01 17:41:17.316457156 +0800
最近更改:2018-11-01 17:40:33.361457755 +0800
最近改动:2018-11-01 17:40:33.361457755 +0800
创建时间:-
[root@localhost Test]# [ eval.sh -ef exec.sh ] && echo true || echo false
false # 判断文件是否存在相同的设备和inode number
[root@localhost Test]# [ eval.sh -nt exec.sh ] && echo true || echo false
false # 判断文件eval.sh修改日期是否比文件exec.sh新
[root@localhost Test]# [ eval.sh -ot exec.sh ] && echo true || echo false
true # 判断文件eval.sh修改日期是否比文件exec.sh旧
[root@localhost Test]# echo $centos
# 变量未定义
[root@localhost Test]# [ -f $centos ] && echo true || echo false
true # 变量未定义,却返回true,逻辑不符
[root@localhost Test]# [ -f "$centos" ] && echo true || echo false
false # 添加引号后,逻辑正确
注意事项如下:
1、在判断文件的读写执行权限,不单单是看文件rwx属性,还要根据当前测试的用户是否也具备相应的操作权限
2、在使用[]进行判断时,需要注意双引号特殊用法
Shell字符测试
常用字符测试表达式
字符测试常用于判断字符是否相同,长度是否为零、字符是否为空等,常见的字符测试如下所示:
| 字符操作符 | 英文含义 | 含义 |
|---|---|---|
| -n STRING | nonzero | 字符串长度不为零,则为真 |
| -z STRING | zero | 字符串长度为零,则为真 |
| STRING1 = STRING2 | STRING1和STRING2是相等,则为真 | |
| STRING1 != STRING2 | STRING1和STRING2是不相等,则为真 |
字符测试注意事项:
1、字符测试中一定要添加双引号
2、比较符号的两端一定要添加空格
字符测试表达式示例
[root@localhost Test]# [ -n "Test" ] && echo true || echo false
true
[root@localhost Test]# [ -z "Test" ] && echo true || echo false
false
[root@localhost Test]# [ "Test" = "Test" ] && echo true || echo false
true
[root@localhost Test]# [ "Test" != "Test" ] && echo true || echo false
false
[root@localhost Test]# [ -z "" ] && echo true || echo false
true
Shell整数测试
常用整数测试表达式
| []/test比较符号 | 英文含义 | ( ( ) )/[ [ ] ]比较符号 |
|---|---|---|
| -eq | equal | ==/= |
| -ge | greater than or equal | >= |
| -gt | greater than | > |
| -le | less than or equal | <= |
| -lt | less than | < |
| -ne | not equal | != |
整数测试表达式注意事项如下所示:
1、=和!=也可以用在[]中进行比较,但在[]中使用< 和 > 时,需要进行转义,否则结果会出现不正确的情况
2、比较符号两端需要添加空格
整数测表达式示例
[root@localhost ~]# [ 8 > 4 ] && echo true || echo false
true
[root@localhost ~]# [ 4 > 8 ] && echo true || echo false
true # 未进行转义时,结果输出存在错误
[root@localhost ~]# [ 4 \> 8 ] && echo true || echo false
false # 进行转义后,结果输出正确
[root@localhost ~]# [ 8 != 8 ] && echo true || echo false
false
[root@localhost ~]# [ 8 == 8 ] && echo true || echo false
true
[root@localhost ~]# [ 8 = 8 ] && echo true || echo false
true
[root@localhost ~]# [ 4 -gt 8 ] && echo true || echo false
false
[root@localhost ~]# [ 4 -lt 8 ] && echo true || echo false
true
[root@localhost ~]# [ 8 -eq 8 ] && echo true || echo false
true
[root@localhost ~]# [ 8 -ne 8 ] && echo true || echo false
false
[root@localhost ~]# [[ 8 -ne 8 ]] && echo true || echo false
false
[root@localhost ~]# [[ 8 != 8 ]] && echo true || echo false
false
[root@localhost ~]# (( 8 != 8 )) && echo true || echo false
false
[root@localhost ~]# (( 8 == 8 )) && echo true || echo false
true
[root@localhost ~]# a=90;b=97 # 通过变量传递进行比较
[root@localhost ~]# [ $a -gt $b ] && echo true || echo false
false
[root@localhost ~]# [ $a -le $b ] && echo true || echo false
true
在使用整数比较时,需要注意数字必须是整数,否则会出现报错。[]与(())区别如下所示:
[ number1 -lt number2 ] # 比较运算符两端和[]间必须有空格
((number1<number2)) # (())无空格要求
Shell逻辑测试
常用逻辑测试表达式
| []/test比较符号 | 英文含义 | ( ( ) )/[ [ ] ]比较符号 |
|---|---|---|
| -a | and | && |
| -o | or | || |
| ! | not | ! |
在以上逻辑测试结果中
- 1:代表结果为真True
- 0:代表结果为假False
- -a和-o仅适用于[],不能用在[[]]
- []和[ [] ]两端必须有空格,( ( ) )无此要求
逻辑测试表达式示例
[root@localhost ~]# [ 8>7 -a 9>2 ] && echo true || echo false
true
[root@localhost ~]# [ 8>7 -o 9>2 ] && echo true || echo false
true
[root@localhost ~]# [ 8>7 -o 9>21 ] && echo true || echo false
true
[root@localhost ~]# [ ! 9>21 ] && echo true || echo false
true
[root@localhost ~]# [ -f /etc/hosts -a /etc/passwd ] && echo true || echo false
true
[root@localhost ~]# a="/etc/hosts";b="/etc/passwd"
[root@localhost ~]# [ -f $a -o -f $b ] && echo true || echo false
true
[root@localhost ~]# [ -f "$a" ] && [ -f "$b" ] && echo true || echo false
true
[root@localhost ~]# [ -f $a ] && [ -f $b ] && echo true || echo false
true
[root@localhost ~]# [[ -f $a -a -f $b ]] && echo true || echo false
-bash: 条件表达式中有语法错误
-bash: `-a' 附近有语法错误
[root@localhost ~]# [[ -f $a && -f $b ]] && echo true || echo false
true
Shell条件测试总结
| 测试表达式符号 | [ ] | test | [ [ ] ] | ( ( ) ) |
|---|---|---|---|---|
| 边界是否需要空格 | 需要 | 需要 | 需要 | 不需要 |
| 逻辑操作符 | -a/-o/! | -a/-o/! | &&/||/! | &&/||/! |
| 整数比较符 | -eq/-ge/-gt/-le/-lt/-ne | -eq/-ge/-gt/-le/-lt/-ne | -eq/-ge/-gt/-le/-lt/-ne或=/>=/>/<=/</!= | =/>=/>/<=/</!= |
| 字符串比较符 | =/==/!= | =/==/!= | =/==/!= | =/==/!= |
| 是否支持通配符 | 不支持 | 不支持 | 支持 | 不支持 |
本文同步在微信订阅号上发布,如各位小伙伴们喜欢我的文章,也可以关注我的微信订阅号:woaitest,或扫描下面的二维码添加关注:

Shell编程-05-Shell中条件测试与比较的更多相关文章
- linux shell编程(二) 条件测试
bash中常用的条件测试有三种 条件测试的表达式:[ expression ] [[ expression]] 第一种:整数测试: -eq 测试两个整数是否相等,比如[ $A -eq $B ] -n ...
- Shell 编程 (变量和条件测试)
变量: 1 . 变量声明 直接使用变量 + 赋值 #!/bin/bash NAME='HELLO WORD' echo $NAME 使用 declare 关键字声明 declare(选项)(参数) + ...
- shell编程系列7--shell中常用的工具find、locate、which、whereis
shell编程系列7--shell中常用的工具find.locate.which.whereis .文件查找之find命令 语法格式:find [路径] [选项] [操作] 选项 -name 根据文件 ...
- shell编程系列6--shell中的函数
shell编程系列6--shell中的函数 .函数介绍 linux shell中的函数和大多数编程语言中的函数一样 将相似的任务或者代码封装到函数中,供其他地方调用 语法格式 第一种格式 name() ...
- 【Shell编程】Shell程序设计
1.Shell简介 作为Linux灵感来源的Unix系统最初是没有图形化界面的,所有的任务都是通过命令行来实现的.因此,Unix的命令行系统得到了很大的发展,逐步成为一个功能强大的系统. Sh ...
- 【Linux】【Shell】【Basic】条件测试和变量
bash脚本编程 脚本文件格式: 第一行,顶格:#!/bin/bash 注释信息:# 代码注释: 缩进,适度添加空白行: ...
- 【Shell编程】Shell基本语法
Shell 语法 Shell程序设计作为一种脚本语言,在Linux系统中有广泛的应用,本文记录了关于Shell程序设计的基础语法知识和常用命令,方便查询,熟练使用shell也需要经常实践,这对于完 ...
- Linux shell编程02 shell程序的执行 及文件权限
第一个shell脚本 1. shell编程的方式 交互式shell编程 非交互式shell编程:执行的语句存放到一个文件 shell脚本:可以任意文件名,建议扩展名为sh 2. ...
- shell编程01—shell基础
01.学习shell编程需要的知识储备 1.vi.vim编辑器的命令,vimrc设置 2.命令基础,100多个命令 3.基础.高端的网络服务,nfs,rsync,inotify,lanmp,sersy ...
随机推荐
- 实现Action的三种方式
实现Action的三种方式: 1.普通类 一般采用此种方法 2.实现Action接口 3.继承ActionSupport类
- hibernate经常报的几个不起眼的错误, 都是因为不细心或者手滑了输入有误造成了
最近会经常用到hibernate了, 也经常报错, 看着屏幕上一根大红条是非常不爽的, 这几天集合了一下经常报的错误, 整合一下放到这里, 以后再出现这个错误直接去解决就好了 1, org.hiber ...
- Date.parse和new Date(str)的兼容性问题
Date.parse和new Date(str)的兼容性问题 Date '2015-05-04'是无法被各个浏览器中,使用new Date(str)来正确生成日期对象的. 正确的用法是'2015/05 ...
- clion register
1. 使用 activation code 激活 安装完软件后,启动,在要求输入注册码的界面(菜单栏 ⇒ help ⇒ register)选择“License server”输入“http://ide ...
- subprocess 粘包问题
1.执行命令: 在py代码中去如何调用操作系统的命令 新模块:subprocess r = subprocess.Popen('ls',shell=True,stdout=subprocess.PIP ...
- Little-endian和Big-endian(小端数据和大端数据)
Little和Big指的是内存地址的大小,end指的是数据的末尾. Little-endian指内存地址低的地方存数据的末尾(即低字节) Big-endian指内存地址高的地方存数据的末尾(即高字节) ...
- (重要)LRU cache
[抄题]: [思维问题]: 需要从任何位置访问某数字有没有(重要 ),返回其位置(不重要),所以用hashmap. 需要从任何位置删除,用linkedlist.最终二者结合,用linked hashm ...
- 利用redis完成自动补全搜索功能(二)
前面介绍了自动完成的大致思路,现在把搜索次数的功能也结合上去.我采用的是hash表来做的,当然也可以在生成分词的时候,另外一个有序集合来维护排序, 然后2个有序集合取交集即可.这里介绍hash的方式来 ...
- linux的ssh服务
1.检查是否安装ssh > rpm -qa|grep ssh 2.安装ssh服务 > yum install ssh 配置 /etc/ssh/sshd_config 端口 22 3.启动s ...
- java Arrays.asList用法
java Arrays.asList用法 用途 Arrays是java容器相关操作的工具类,asList方法将Array转换为list,是Array和List之间的桥梁. 注意 Arrays.asLi ...