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,则为真,即测试表达式成立,但不能用"!=="代替"!=";

以下是针对字符串测试操作符的提示:

  1. 对于字符串的测试,一定要将字符串加双引号之后在进行比较。如[-n $myvar],特别是使用[]的场景;
  2. 比较符号(例如=和!=)的两端一定要有空格;
  3. "!="和"="可用于比较两个字符串是否相同;

示例:

[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,非,两端相反,则结果为真

对于上述操作符,有如下提示:

  1. 逻辑操作符前后的表达式是否成立,一般用真假来表示;
  2. "!"的中文意思是反,即与一个逻辑值相反的逻辑值;
  3. -a的中文意思是"与"(and或&&),前后两个逻辑值都为"真",综合返回值才为"真",反之为"假";
  4. -o的中文意思是"或"(or或||),前后2个逻辑值只要有一个为"真",返回值就为"真";
  5. 连接两含[]、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脚本的条件测试与比较的更多相关文章

  1. shell脚本之六:shell脚本的条件测试与比较

    六.shell脚本的条件测试与比较 (一)条件表达式的常见语法 1.条件表达式6种写法(if,while) 语法1:test<测试表达式> 语法2:[ <测试表达式>] #中括 ...

  2. shell脚本学习—条件测试和循环语句

    条件测试 1. 条件测试:test [ 命令test或[可以测试一个条件是否成立,如果测试结果为真,则该命令的Exit Status为0,如果测试结果为假, 则命令的Exit Status为1(注意与 ...

  3. Shell脚本下条件测试(eq.ne.....)(转载)

    转载:http://cxj632840815.blog.51cto.com/3511863/1168709 Shell编程中的条件测试 在Linux编程中经常会用到判断数值的大小,字符串是否为空这样或 ...

  4. shell编程:条件测试与比较(六)

    条件测试方法综述 test条件测试的简单语法及测试 范例6-1 测试文件(在test命令中使用-f选项:文件存在且为不同文件则表达式成立) [root@adminset ~]# test -f fil ...

  5. (转)shell脚本之文件测试操作符及整数比较符

    shell脚本之文件测试操作符及整数比较符 原文:http://www.cnblogs.com/Steward-Xu/p/6722592.html 一.文件测试操作符: 在书写测试表达式是,可以使用一 ...

  6. shell脚本之文件测试表达式

    1.文件测试表达式的用法 我们在编程时处理一个对象时,需要对对象进行测试,只有符合要求的才采取操作处理:这样做的好处是避免程序出错以及无所畏的消耗系统资源,这个测试的对象可以是文件.字符串.数字等. ...

  7. Shell脚本IF条件判断和判断条件总结

    转自:http://m.jb51.net/article/56553.htm 这篇文章主要介绍了Shell脚本IF条件判断和判断条件总结,本文先是给出了IF条件判断的语法,然后给出了常用的判断条件总结 ...

  8. shell脚本中文件测试

    shell脚本中文件测试 author:headsen chen  2017-10-17  14:35:19 个人原创,转载请注明作者,否则 依法追究法律责任 [ -f  filename  ]   ...

  9. Shell学习之条件测试(四)

    Shell学习之条件测试 目录 逻辑测试 文件测试 数值比较 字符串比较 逻辑测试 格式: [ 表达式 ] 操作符 [ 表达式2 ] …… 命令1 操作符 命令2 …… 常用的操作符 ( 注意:-a和 ...

随机推荐

  1. line-height与图文对齐 笔记

    基本概念: 块:block 特点独行 内联:inline 内联块:inline-block 如果元素display属性默认值为block,则为块元素.如div p 如果元素display属性默认值为i ...

  2. Qt 2D绘图之六:图形视图框架的事件处理与传播

    一.简介 图形视图框架中的事件都是首先由视图进行接收,然后传递给场景,再由场景传递给相应的图形项.而对于键盘事件,它会传递给获得焦点的图形项,可以使用QGraphicsScene类的setFocusI ...

  3. Gym - 101810E ACM International Collegiate Programming Contest (2018)

    bryce1010模板 http://codeforces.com/gym/101810 #include<bits/stdc++.h> using namespace std; #def ...

  4. 牛客网Java刷题知识点之什么是cookie、什么是session、cookie和session有什么区别

    不多说,直接上干货! https://www.nowcoder.com/ta/review-java/review?tpId=31&tqId=21170&query=&asc= ...

  5. centos7 更换jdk版本

    查看java版本   java -version 如果有java版本(如果没有直接看红色虚线以下的) 输入 rpm -qa | grep java会显示以下几条内容: ******* ******** ...

  6. 满足java对redis的所有操作,token,验证码过期时间等

    很实用 链接在此  https://www.cnblogs.com/edisonfeng/p/3571870.html System.out.println("=============== ...

  7. 编写可执行程序,其它程序调用,并返回数据,C#

    有时候在创建临时文件或文件夹,使用完成后,释放失败,删除提示占用,又不能结束主程序,就可以通过别的方法来解决 比如,另外创建一个程序,单独执行任务,完成后结束程序,并返回执行结果,上述问题就能解决. ...

  8. MvcPager无刷新分页,包含搜索和跳转功能

    1.MVC无刷新分页和搜索(第一版)  http://pan.baidu.com/s/1eRQ7Ml8  密码:uqf7 出现的问题: 1)程序不走判断条件一直为false, 错误原因:1)可能没有引 ...

  9. volatile双重锁实现单例

    双重锁实现单例时遭到质疑,既是:双重锁也无法保证单例模式! 原因是:指令会重排序,普通的变量仅仅会保证该方法在执行时,所有依赖的赋值结果是正确的,但不会保证执行顺序! 为什么会重排序:指令重排序是指c ...

  10. webpack(1)

    在网页中会引用哪些常见的静态资源? JS .js .jsx .coffee .ts(TypeScript 类 C# 语言) CSS .css .less .sass .scss Images .jpg ...