总第1篇
test就是測试的意思,经常使用在流程控制语句中作为条件。以下做一下介绍。

关于真值

与其它语言不同,Bash(包含其它Shell)中,是用0表示真,非0表示假的。
之所以用0表示成功,而不是1来表示。我觉得也是有一定道理的,由于成功的情况仅仅有一种,而出错的可能却有很多,所以用正数来表示错误。不同的正数代表着不同的错误,所以普通情况下能够通过正数的值来推断是出了什么错误。

假设你有过POSIX编程经验(比方Linux下C编程),你会知道一个errno的东西。你也会知道大量的if语句用来測试一个函数的调用结果。每一个函数基本上都是返回0时表示操作成功。而假设返回非0则出错,此时你也要exit(0)。

以下言归正传

測试整数

基本规则

整数的test就是大小关系的比較。与其它语言不同。Bash中没有使用<,>来做大于等于号。而是使用了减号开头的选项来比較。

假如有两个整数变量a和b。

那么比較a是否大于b,就写作test $a -gt $b,符合条件返回真值0。
实际在终端里測试的时候能够这样写来看test语句的运行结果:

test $a -gt $b && echo Yes

假设条件成立打印 Yes,不成立不打印。

所有选项

选项 描写叙述 英文全称
eq 等于 equal
gt 大于 greater than
lt 小于 less than
ne 不等于 not equal
ge 大于等于 greater or equal
le 小于等于 less or equal

注意:

每一个选项前须要有一个短横线-

还要注意的是使用以上操作符,那么操作符两边一定要是整数。

在Bash中,即使给整数加了引號。比方"123",也视作整数。但假设某一位含有整数[0-9]以外的字符比方。12a,"12a",则不行。

Bash脚本,或者说Shell终端中的各种命令都有非常丰富的选项。所以我建议在记忆的时候要去记忆它的英文全称。理解了它的含义,这样反而会减少记忆的难度。

測试字符串

字符串的測试无非就是包含。推断两个字符串是否相等,推断一个字符串是否为空。
假设str1和str2是持有两个字符串的变量(直接測试两个字符串。而非字符串变量时,则不加$。这非常好理解)。

详细使用方法为:

使用方法 描写叙述
test $str1 = $str2 測试是否相等,相等返回0
test $str1 != $str2 測试是否不等。不等返回0
test $str1 \< $str2 假设str1的字典序在str2之后,则返回0
test $str1 \> $str2 假设str1的字典序在str2之前,则返回0
test $str1 总是返回0
test -n $str1 假设不为空返回0
test -z $str1 假设是空串,返回0

关于字典序的那两个比較,事实上就是大于号>和小于号<。由于bash中这两个符号有重定向的意思。所以这里要使用反斜杠\ 转义。

#在bash中一个好的习惯就是在引用变量的时候加上双引號。

比方以下:

特别注意
选项-n是 nonzero 的缩写,理解为长度不为0但须要特别指出的是:-n选项測试时请将引用变量外加上双引號。

Bash中的引用变量的方法有非常多种,我觉得此处应该是加不加双引號无所谓的。

囧。。
经測试,假设我有当前没有定义变量var(或者定义为var=""),那么理论上讲,var就是空串。
test -n $var应该是返回1(假)的,由于他的长度是0。但事实上此时不管var是否为空串都会返回真值0。
可是加上双引號(注意不能是单引號),也就是test -n "$var",效果就能如期,即仅仅有在var为空的时候返回真值0。
而选项-z(是 zero 的缩写,理解为长度为0)引用变量的时候加不加双引號无所谓。

測试文件

測试文件须要用到大量的选项。这里我仅仅写一个经常使用的,其它的大家自行man test

针对单个文件

选项 描写叙述
d 是否为文件夹
f 是否为普通文件
x 是否有运行权限
r 是否有读权限
w 是否写读权限
e 是否存在
s 文件大小是否大于0
c 是否为字符设备文件
b 是否为块设备文件

以上条件在成立的时候返回真值0。详细使用方法比方:

test -f hello.c
test -d /home

针对两个文件

使用方法 描写叙述
test file1 -nt file2 測试file1的改动时间是不是比file2 new(新)
test file1 -ot file2 測试file1的改动时间是不是比file2 old(旧)
test file1 -ef file2 測试两者是相同的设备和具有相同的结点(inode)数

相同的,若是条件成立则返回真值0,否则返回假值1。注意这里的file1,file2就是文件名称的字符串了。

#能够直接test a.c -nt b.c
#或者是
a=a.c
b=b.c
test $a -nt $b

不再细表。

逻辑运算

逻辑运算就是与或非。Bash中相同有&&。||可是并不是是在test内部。而是用来组合多条shell语句,前面我们应该看到过了。仅仅有当&&前面的语句运行成功时,才运行后面的语句。而在test内部:

运算符 描写叙述
-a 逻辑与
-o 逻辑或
! 逻辑非

使用方法如:

test $a -lt $b -a $a -gt $c
test $a -lt $b -o $a -gt $c
test ! -d sleep.sh && echo Yes #假设sleep.sh不是文件夹,就打印Yes

事实上完整版是这样:

test $a -lt $b -a test $a -gt $c
test $a -lt $b -o test $a -gt $c

简化版test

在读完这一部分后,你可能会惊呼。怎么不早点告诉我。

哈哈。

事实上以上所有的test命令都能够用方括号替换。

比方

test -f hello.c

能够换成

[ -f hello.c ]

怎么样,非常方便吧。注意的是。方括号和表达式前后各有一个空格间隔哦。不要丢掉。

实际也就是 [空格-f hello.c空格]

其它注意的地方是方括号的逻辑表达式。比方

test $a -lt $b -a $a -gt $c

能够转化为

[ $a -lt $b -a $a -lt $c ]

另外有一操作符 [[ ]]支持使用 &&, ||来进行表达式的逻辑运算. [ ] 与 [[ ]]两者详细区别请见:http://www.cnblogs.com/include/archive/2011/12/09/2307905.html

test是Shell的外部命令,而[ ]是Shell内置的操作符。

本系列(玩转Bash脚本)很多其它文章,请訪问:http://blog.csdn.net/column/details/wanbash.html

玩转Bash脚本:test測试语句的更多相关文章

  1. 玩转Bash脚本:选择结构之case

    总第5篇 之前,我们谈到了if. 这次我们来谈还有一种选择结构--case. case与if if用于选择的条件,不是非常多的情况,假设选择的条件太多.一系列的if.elif,.也是醉了. 没错,ca ...

  2. 玩转Bash脚本:循环结构之while循环(转)

    转自:http://blog.csdn.net/guodongxiaren/article/details/43341769   总第8篇 本系列(玩转Bash脚本)更多文章,请访问:http://b ...

  3. javascript 的 jasmine 的測试语句

    首先建立环境场景: 一般三个文件夹 lib jasmine的系统文件存放文件夹 spec 写測试用例的文件夹 src 存放源码的文件夹(被測对象) specRunner.html 測试入口文件. 入口 ...

  4. 写着玩的bash脚本

    #!/bin/bash function strealingManu { pwdfolder=`pwd` for var in "$@" do man 1 $var > $p ...

  5. MySQL Study之--MySQL压力測试工具mysqlslap

    MySQL Study之--MySQL压力測试工具mysqlslap 一.Mysqlslap介绍     mysqlslap是MySQL5.1之后自带的benchmark基准測试工具,类似Apache ...

  6. Oracle RAC cache fusion原理測试

    Oracle RAC cache fusion是RAC最核心的工作机制.他把全部实例的SGA虚拟成一个大的SGA区,每当不同的实例请求同样的数据块,这个数据块就须要在实例间进行传递. 那究竟什么时候传 ...

  7. 玩转Linux网络namespace-单机自环測试与策略路由

    上周有厂商到公司測试,拿了一块据说非常猛的网络处理加速PCIe板卡,拎在手里沉甸甸的非常有分量,最让人意淫的是那4个万兆光口,于是我迫不及待的想要一览光口转发时那种看不见的震撼. 可是,仅凭4个光口怎 ...

  8. 玩转单元測试之DBUnit

    本文同一时候发表在:http://www.cnblogs.com/wade-xu/p/4547381.html DBunit 是一种扩展于JUnit的数据库驱动測试框架,它使数据库在測试过程之间处于一 ...

  9. 第8章5节《MonkeyRunner源代码剖析》MonkeyRunner启动执行过程-执行測试脚本

    MonkeyRunner在准备好AndroidDebugBridge和DeviceMonitor等服务之后,就基本上是攻克了和目标设备通信的问题了,那往下须要做的就是把測试脚本执行起来了. 178 p ...

随机推荐

  1. PHP学习笔记--文件目录操作(文件上传实例)

    文件操作是每个语言必须有的,不仅仅局限于PHP,这里我们就仅用PHP进行讲解 php的文件高级操作和文件上传实例我放在文章的最后部分.--以后我还会给大家写一个PHP类似于网盘操作的例子 注意:阅读此 ...

  2. SQL点滴之编辑数据(转)

    数据库中的数据编辑是我们遇到的最频繁的工作,这一个随笔中我来总结一下最常用的数据编辑. select into 经常遇到一种情况是,我们希望创建一个新表,表中的数据来源于原有的一个表:原有一个表,但是 ...

  3. bzoj3884: 上帝与集合的正确用法 欧拉降幂公式

    欧拉降幂公式:http://blog.csdn.net/acdreamers/article/details/8236942 糖教题解处:http://blog.csdn.net/skywalkert ...

  4. 详解Asp.net MVC DropDownLists

    Asp.net MVC中的DropDownLists貌似会让一开始从Asp.net Forms转过来的程序员造成不少迷惑.这篇文章讲述了为了使用DropDownLists,你需要在Asp.Net MV ...

  5. web自动化框架之三获取数据库值与界面值比较~~

    数据库用到的是mysql,框架涉及数据库,主要包含两个方面,一个是每个案例执行完毕后,插入案例相关信息与数据:一个是web界面数据核对的时候,需要从sql中获取某行某列值与界面某个值做比较. 描述:w ...

  6. js控制不同的时间段显示不同的css样式

    js控制不同的时间段显示不同的css样式 js函数,可以放到单独的js文件中也可以放到当前页的<head>标记之内 function getCSS(){        datetoday ...

  7. Android 不同应用通过SharedPreference实现共享数据

    Android不同应用之间数据的共享有许多方式,但是我觉得还是使用sharedPreference比较简单和轻量级.如果程序B想要访问程序A的sharedPreference可以通过下面的语句来实现: ...

  8. 斜率DP题目

    uva 12524 题意:沿河有n个点,每个点有w的东西,有一艘船从起点出发,沿途可以装运东西和卸载东西,船的容量无限,每次把wi的东西从x运到y的花费为(y-x)*wi; 问把n个点的东西合并成k个 ...

  9. C语言break语句

    break语句不能用于循环语句和switch语句之外的任何其他语句中: breakh中断switch break如果用于循环,是用来终止循环:break如果用于switch,则是用于终止switch. ...

  10. picture to string

    图片转化为字符原理: 一张m*n大小的图片,实际上可以看成是一个m*n的矩阵.矩阵的每一个元素就是一个Color值,不同的Color值,用不同的Ascii可以在屏幕上打印显示的字符来代替,于是可以得到 ...