玩转Bash脚本:test測试语句
总第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測试语句的更多相关文章
- 玩转Bash脚本:选择结构之case
总第5篇 之前,我们谈到了if. 这次我们来谈还有一种选择结构--case. case与if if用于选择的条件,不是非常多的情况,假设选择的条件太多.一系列的if.elif,.也是醉了. 没错,ca ...
- 玩转Bash脚本:循环结构之while循环(转)
转自:http://blog.csdn.net/guodongxiaren/article/details/43341769 总第8篇 本系列(玩转Bash脚本)更多文章,请访问:http://b ...
- javascript 的 jasmine 的測试语句
首先建立环境场景: 一般三个文件夹 lib jasmine的系统文件存放文件夹 spec 写測试用例的文件夹 src 存放源码的文件夹(被測对象) specRunner.html 測试入口文件. 入口 ...
- 写着玩的bash脚本
#!/bin/bash function strealingManu { pwdfolder=`pwd` for var in "$@" do man 1 $var > $p ...
- MySQL Study之--MySQL压力測试工具mysqlslap
MySQL Study之--MySQL压力測试工具mysqlslap 一.Mysqlslap介绍 mysqlslap是MySQL5.1之后自带的benchmark基准測试工具,类似Apache ...
- Oracle RAC cache fusion原理測试
Oracle RAC cache fusion是RAC最核心的工作机制.他把全部实例的SGA虚拟成一个大的SGA区,每当不同的实例请求同样的数据块,这个数据块就须要在实例间进行传递. 那究竟什么时候传 ...
- 玩转Linux网络namespace-单机自环測试与策略路由
上周有厂商到公司測试,拿了一块据说非常猛的网络处理加速PCIe板卡,拎在手里沉甸甸的非常有分量,最让人意淫的是那4个万兆光口,于是我迫不及待的想要一览光口转发时那种看不见的震撼. 可是,仅凭4个光口怎 ...
- 玩转单元測试之DBUnit
本文同一时候发表在:http://www.cnblogs.com/wade-xu/p/4547381.html DBunit 是一种扩展于JUnit的数据库驱动測试框架,它使数据库在測试过程之间处于一 ...
- 第8章5节《MonkeyRunner源代码剖析》MonkeyRunner启动执行过程-执行測试脚本
MonkeyRunner在准备好AndroidDebugBridge和DeviceMonitor等服务之后,就基本上是攻克了和目标设备通信的问题了,那往下须要做的就是把測试脚本执行起来了. 178 p ...
随机推荐
- 《C++ primer》--第7章
删除指针后,该指针就变成了悬垂指针.悬垂指针指向曾经存放对象的内存,但该对象已经不再存在了. 习题7.8 举一个例子说明什么时候应该将形参定义为引用类型.再举一个例子说明什么时候不应该将形参定义为引用 ...
- 不知道帐号密码的情况下完全重装Mac Min的OS X10.7系统
现状: 1.原系统OS X 10.7 2.老账号不知道密码 3.Mac小盒子 目的: 1.删除老账号 2.更新系统到10.9以上 尝试过程1: 1.按住option键 + 开机 2.选择“磁盘工具” ...
- 如何从ST网站找到对应的固件库
ST官方网站改版后,基本上很难搜索到固件库的地址,找了半天才找到固件库的下载地址,通过此方法可以找到其他需要的资源,故记下来方便大家. 下载的网站地址为: Home>Tools and Soft ...
- 添加删除ASM磁盘
创建磁盘: [root@kel ~]# oracleasm createdisk KEL3 /dev/sdf1 Writing disk header: done Instantiating disk ...
- bzoj 4278 [ONTAK2015]Tasowanie(SA,贪心)
[题意] 给定两个字符串,求二路归并后最小字典序的字符串. [思路] 连接两个字符串后求出rank数组.通过比较rank数组进行二路归并. [代码] #include<cstdio> #i ...
- pci hole -- 被吞噬的内存
参见wiki: http://en.wikipedia.org/wiki/PCI_hole PCI 空洞 pci 空洞是32位硬件和32位操作系统一个导致计算机显示的内存比实际安装的内存少的一个限制. ...
- win7旗舰版通知windows不是正版副本解决方法
原文转载http://www.cnblogs.com/simple_666/archive/2013/04/13/win7%E6%97%97%E8%88%B0%E7%89%88%E9%80%9A%E7 ...
- java 复习003 之排序篇
由java 复习003跳转过来的C语言实现版见some-sort-algorithms 快速排序(不稳定 O(n log n)) package vell.bibi.sort_algorithms; ...
- 微信分享,使用js,分享给朋友,朋友圈,QQ微博
<script> var imgUrl = "http://www.baidu.com/img/bdlogo.gif"; var lineLink = "ht ...
- Spark系列(八)Worker工作原理
工作原理图 源代码分析 包名:org.apache.spark.deploy.worker 启动driver入口点:registerWithMaster方法中的case LaunchDriver ...