【转】玩转Bash脚本:test测试语句

上一篇 / 下一篇  2015-08-31 14:07:28 / 个人分类:Linux

总第1篇

test

test就是测试的意思,常用在流程控制语句中作为条件。下面做一下介绍。

测试整数

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

假如有两个整数变量a和b。那么比较a是否大于b,就写作 test $a -gt $b ,符合条件返回真值1。实际在终端里测试的时候可以这样写来看test语句的执行结果

  1. 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脚本,或者说Shell终端中的各种命令都有很丰富的选项,所以我建议在记忆的时候要去记忆它的英文全称,理解了它的含义,这样反而会降低记忆的难度。

测试字符串

字符串的测试无非就是包括,判断两个字符串是否相等,判断一个字符串是否为空。

假设str1和str2是持有两个字符串的变量(直接测试两个字符串,而非字符串变量时,则不加$,这很好理解)。具体用法为:

test $str1 = $str2测试是否相等,相等返回1
test $str1 != $str2测试是否不等,不等返回1
test $str1 \< $str2如果str1的字典序在str2之前,则返回1
test $str1 \> $str2如果str1的字典序在str2之后,则返回1
test $str1如果不为空返回1
test -n $str1如果不为空返回1
test -z $str1如果是空串,返回1

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

选项-n是 nonzero 的缩写。选项-z是 zero 的缩写。这样好记忆了吧

测试文件

测试文件需要用到大量的选项,这里我只写一个常用的,其他的大家自行 man test

针对单个文件
 

选项

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

以上条件在成立的时候返回真值1。具体用法比如:

  1. 01.test -f hello.c    
  2. 02.test -d /home    
  3. 03....    

针对两个文件

用法描述
test file1 -nt file2测试file1的修改时间是不是比file2 new(晚)
test file1 -ot file2测试file1的修改时间是不是比file2 old(早)
test file1 -ef file2测试两者是相同的设备和具有相同的结点(inode)数

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

  1. 01.#可以直接    
  2. 02.test a.c -nt b.c    
  3. 03.#或者是    
  4. 04.a=a.c    
  5. 05.b=b.c    
  6. 06.test $a -nt $b    

不再细表。

逻辑运算

逻辑运算就是与或非。

  • -a 逻辑与
  • -o 逻辑或
  • ! 逻辑非

用法如:

  1. 01.test $a -lt $b -a $a -gt $c    
  2. 02.test $a -lt $b -o $a -gt $c    
  3. 03.test ! -d sleep.sh && echo Yes #如果sleep.sh不是目录,就打印Yes   

其实完整版是这样:

  1. 01.test $a -lt $b -a test $a -gt $c    
  2. 02.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 ]

或者分开作为两条语句

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

这个&&并无什么特别之处,并非方括号运算所独有。此处就是当前面语句为真时,接着执行后面的语句。所有的Bash语句都可以用&&或||连接。


TAG:

 

评分:0

我来说两句

Open Toolbar