Shell脚本的条件测试与比较
Shell脚本的条件测试与比较
一、shell脚本的条件测试
通常,在bash的各种条件结构和流程控制结构中都要进行各种测试,然后根据测试结构执行不同的操作,有时也会与if等条件语句相结合,来完成测试判断,以减少程序运行的错误。
执行条件测试表达式后通常会返回"真"或"假",就行执行命令后返回的值为0表示真,非0表示假一样。
Bash编程中条件测试常用的语法:
条件测试语法 |
说明 |
语法一:test<测试表达式> |
这是利用test命令进行测试表达式的方法。test命令和"<测试表达式>"之间至少有一个空格; |
语法二:[<测试表达式>] |
这是通过[](单中括号)进行条件测试表达式的方法,和test命令的用法相同。[]的边界和内容之间至少有一个空格; |
语法三:[[<测试表达式>]] |
这是通过[[]](双中括号)进行条件测试表达式的方法。是比test和[]更新的语法格式。[[]]的边界和内容之间至少有一个空格; |
语法四:((<测试表达式>)) |
这是通过(())(双小括号)进行条件测试表达式的方法,一般用于if语句里。(())(双小括号)两端不需要有空格; |
针对上表格有几个注意事项需要说明下:
语法一中的test命令和语法二中的[]是等价的。语法三种的[[]]为扩展的test命令,语法四中的(())常用语计算,建议使用相对友好的语法二,即中括号[]的语法格式;
在[[]]中可以使用通配符等进行模式匹配,这是区别于其他几种语法格式的地方;
&&、||、>、<\等操作符可以应用于[[]]中,但不能应用于[]中,在[]中一般用-a、-o、-gt(用于整数)、-lt(用于整数)代替上述操作符;
对于整数的关系运算,也可以使用shell的算数运算符(());
示例:
test -f file && echo true || echo false
二、文件测试表达式
常用文件测试操作符 |
说明 |
-d文件,d的全拼为directory |
文件存在且为目录则为真,即测试表达式成立; |
-f文件,f的全拼为file |
文件存在且为普通文件则为真,即测试表达式成立; |
-e文件,e的全拼为exist |
文件存在则为真,即测试表达式成立。区别于"-f","-e"不能辨别是目录还是文件; |
-r文件,r的全拼为read |
文件存在且可读测试为真,即测试表达式成立; |
-s文件,s的全拼为size |
文件存在且文件大小不为0则为真,即测试表达式成立; |
-w文件,w的全拼为write |
文件存在则可写为真,即测试表达式成立; |
-x文件,x的全拼为executable |
文件存在且可执行为真,即测试表达式成立; |
-L文件,L的全拼为link |
文件存在且链接文件则为真,即测试表达式成立; |
f1 -nt f2,nt的全拼为newer than |
文件f1比文件f2新则为真,即测试表达式成立。根据文件的修改时间来计算; |
f1 -ot f2,nt的全拼为older than |
文件f1比文件f2旧则为真,即测试表达式成立。根据文件的修改时间来计算; |
这些操作符号对于[[]]、[]、test的测试表达式几乎是通用的。
三、字符测试表达式
字符串测试操作符的作用包括;比较两个字符串是否相同、测试字符串的长度是否为零,字符串是否为NULL等;
常用字符串测试操作符 |
说明 |
-n"字符串" |
若字符串的长度不为0,则为真,即测试表达式成立,n可以理解为no zero; |
-z"字符串" |
若字符串的长度为0,则为真,即测试表达式成立,z可以理解为zero的缩写; |
"串1"=串2' |
若字符串1等于字符串2,则为真,即测试表达式成立,可以用"=="代替"="; |
"串1"!="串2" |
若字符串1不等于字符串2,则为真,即测试表达式成立,但不能用"!=="代替"!="; |
以下是针对字符串测试操作符的提示:
- 对于字符串的测试,一定要将字符串加双引号之后在进行比较。如[-n $myvar],特别是使用[]的场景;
- 比较符号(例如=和!=)的两端一定要有空格;
- "!="和"="可用于比较两个字符串是否相同;
示例:
[root@shell ~]# [ -n "abc" ] && echo 1 || echo 0 #如果字符串长度不为0,则输出1,否则输出0;
#因为字符串为abc,长度不为0,因此为真,输出1;
四、整数二元比较操作符
在[]以及test中使用的比较符号 |
在(())和[[]]中使用的比较符号 |
说明 |
-eq |
==或= |
相等,全拼为equal |
-ne |
!= |
不相等,全拼为not equal |
-gt |
> |
大于,全拼为gerater than |
-ge |
>= |
大于等于,全拼为gerater equal |
-lt |
< |
小于,全拼为less than |
-le |
<= |
小于等于,全拼为less equal |
以下是针对上述符号的特别说明:
1、"="和"!="也可以在[]中作比较使用,但在[]中使用包含">"和"<"的符号时,需要用反斜线转义,有时不转义虽然语法不会报错,但是结果可能会不对;
2、也可以在[[]]中使用包含"-gt"和"-lt"的符号,但是不建议这样使用;
3、比较符号两端也要有空格;
示例:
[root@shell ~]# [ 2 = 1 ] && echo 1 || echo 0
0
[root@shell ~]# [ 2 \< 1 ] && echo 1 || echo 0
0
五、逻辑操作符
在[]和test中使用的操作符 |
在[[]]和(())中使用的操作符 |
说明 |
-a |
&& |
and,与,两端都为真,则结果为真 |
-o |
|| |
or,或,两端有一个为真,则结果为真 |
! |
! |
Not,非,两端相反,则结果为真 |
对于上述操作符,有如下提示:
- 逻辑操作符前后的表达式是否成立,一般用真假来表示;
- "!"的中文意思是反,即与一个逻辑值相反的逻辑值;
- -a的中文意思是"与"(and或&&),前后两个逻辑值都为"真",综合返回值才为"真",反之为"假";
- -o的中文意思是"或"(or或||),前后2个逻辑值只要有一个为"真",返回值就为"真";
- 连接两含[]、test或[[]]的表达式可用&&或||;
示例:
[root@shell ~]# [ -f /etc/hosts -a -f /etc/services ] && echo 1 || echo 0
1
[root@shell ~]# [[ -f /etc/hosts && -f /etc/services ]] && echo 1 || echo 0
1
说明:-a和&&的运算规则:只有逻辑操作符两端的表达式都成立时才为真;真(true)表示成立,对应的数字为1;假(false)表示不成立,对应的数字为0。
六、测试表达式test、[]、[[]]、(())的区别总结
测试表达式操作符 |
[] |
test |
[[]] |
(()) |
边界是否需要空格 |
需要 |
需要 |
需要 |
不需要 |
逻辑操作符 |
!、-a、-o |
!、-a、-o |
!、&&、|| |
!、&&、|| |
整数比较操作符 |
-eq、-gt、-lt、-ge、-le |
-eq、-gt、-lt、-ge、-le |
-eq、-gt、-lt、-ge、-le或=、>、<、>=、<= |
=、>、<、>=、<= |
字符串比较操作符 |
=、==、!= |
=、==、!= |
=、==、!= |
=、==、!= |
是否支持通配匹配符 |
不支持 |
不支持 |
支持 |
不支持 |
Shell脚本的条件测试与比较的更多相关文章
- shell脚本之六:shell脚本的条件测试与比较
六.shell脚本的条件测试与比较 (一)条件表达式的常见语法 1.条件表达式6种写法(if,while) 语法1:test<测试表达式> 语法2:[ <测试表达式>] #中括 ...
- shell脚本学习—条件测试和循环语句
条件测试 1. 条件测试:test [ 命令test或[可以测试一个条件是否成立,如果测试结果为真,则该命令的Exit Status为0,如果测试结果为假, 则命令的Exit Status为1(注意与 ...
- Shell脚本下条件测试(eq.ne.....)(转载)
转载:http://cxj632840815.blog.51cto.com/3511863/1168709 Shell编程中的条件测试 在Linux编程中经常会用到判断数值的大小,字符串是否为空这样或 ...
- shell编程:条件测试与比较(六)
条件测试方法综述 test条件测试的简单语法及测试 范例6-1 测试文件(在test命令中使用-f选项:文件存在且为不同文件则表达式成立) [root@adminset ~]# test -f fil ...
- (转)shell脚本之文件测试操作符及整数比较符
shell脚本之文件测试操作符及整数比较符 原文:http://www.cnblogs.com/Steward-Xu/p/6722592.html 一.文件测试操作符: 在书写测试表达式是,可以使用一 ...
- shell脚本之文件测试表达式
1.文件测试表达式的用法 我们在编程时处理一个对象时,需要对对象进行测试,只有符合要求的才采取操作处理:这样做的好处是避免程序出错以及无所畏的消耗系统资源,这个测试的对象可以是文件.字符串.数字等. ...
- Shell脚本IF条件判断和判断条件总结
转自:http://m.jb51.net/article/56553.htm 这篇文章主要介绍了Shell脚本IF条件判断和判断条件总结,本文先是给出了IF条件判断的语法,然后给出了常用的判断条件总结 ...
- shell脚本中文件测试
shell脚本中文件测试 author:headsen chen 2017-10-17 14:35:19 个人原创,转载请注明作者,否则 依法追究法律责任 [ -f filename ] ...
- Shell学习之条件测试(四)
Shell学习之条件测试 目录 逻辑测试 文件测试 数值比较 字符串比较 逻辑测试 格式: [ 表达式 ] 操作符 [ 表达式2 ] …… 命令1 操作符 命令2 …… 常用的操作符 ( 注意:-a和 ...
随机推荐
- IQueryable 和IEnumberable的区别
一.IEnumerable接口 公开枚举器,该枚举器支持在指定类型的集合上进行简单的迭代.即:实现了此接口的object,就可以使用foreach遍历该object: 二.IQueryable 接口 ...
- bzoj1339/1163:[Baltic2008]Mafia
传送门 最小割,割点,模板... 代码: #include<cstdio> #include<iostream> #include<algorithm> #incl ...
- Java并发编程面试题1
package com.mozq.thread.producer2; /* * 面试题2:以下代码是否存在错误 class ThreadTest implements Runnable{ public ...
- win10无法写入删改c盘文件的解决方法
前言 最近使用了win10系统,结果发现无法对c盘的文件进行写入删改,在网上到处搜集资料,终于找到了解决方法,这里总结一下. 首先,本文针对的是win10家庭版,家庭版默认是不提供组策略功能,而我们需 ...
- Python 杂集
Python字符串方法 Python递归和迭代 Python判断字符串编码以及编码的转换 exec 和 eval
- UVa12304(计算几何中圆的基本操作)
断断续续写了250多行的模拟,其间被其他事情打扰,总共花了一天才AC吧~ 这道题目再次让我明白,有些事情看起来很难,实际上并没有我们想象中的那么难.当然了我主要指的不是这个题的难度…… 也是初学计算几 ...
- IDEA自定义设置快捷键输出你想要的语句!
转载,侵权必删 用Eclipse时间长了, 就习惯之前的快捷键! 当然, IDEA不愧是Java开发的”利器”! 写起代码就是一个字 – “爽”! 建议大家可以去尝试一下! 当然, 在IDEA中输出S ...
- Linux sftp用法
sftp用法 1. 用sftp如何登录服务器 sftp 是一个交互式文件传输程式.它类似于 ftp, 但它进行加密传输,比FTP有更高的安全性.下边就简单介绍一下如何远程连接主机,进行文件的上传和下载 ...
- 灰度共生矩阵GLCM分析
纹理分析是对图像灰度(浓淡)空间分布模式的提取和分析.纹理分析在遥感图像.X射线照片.细胞图像判读和处理方面有广泛的应用.关于纹理,还没有一个统一的数学模型.它起源于表征纺织品表面性质的纹理概念,可以 ...
- 【转】阐述Handler的实现原理
面试题:阐述Handler的实现原理 2016年07月18日 21:01:35 阅读数:7574 处理过程: 从handler中获取一个消息对象,把数据封装到消息对象中,通过handler的send… ...