玩转Bash脚本:test測试语句

时间:2022-03-24 18:05:24

总第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