曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 4555|回复: 0
打印 上一主题 下一主题

test 命令与比较测试

[复制链接]

4917

主题

5879

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34382
跳转到指定楼层
楼主
发表于 2011-5-29 14:47:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
简单测试实例-1:
[beyes@localhost ~]$ test 9 -gt 8;echo $?
0
[beyes@localhost ~]$ test 9 -gt 10;echo $?
1
[beyes@localhost ~]$ test -d $HOME ; echo $?
0
上面 test 命令测试跟在后面的表达式,如果结果为真,则返回 0,为假则返回 1 ;-d 选项是测试 $HOME 是不是一个目录。

简单测试实例-2:
[beyes@localhost ~]$ test 9 -gt 10 && echo True || echo false
false
[beyes@localhost ~]$ test 9 -gt 8 && echo True || echo false
True
&& 符号表示前面的测试结果为真,则执行后面的表达式;|| 符号表示前面的结果为假,则执行其后的表达式。尽管 9 -gt 8 的返回值为 0,但 && 符号会认为这种情形就是条件成立的。

test 表达式 命令和 [ 表达式 ] 符号是等价的,如:
[beyes@localhost ~]$ [ "hello" != "world" ]; echo $?
0


算式比较符号有以下几种
-eq、 -ne、-lt、 -le、 -gt、 -ge 分别表示等于、不等于、小于、小于等于、大于、大于等于。

比较字符串则有以下操作符:
=、 !=、< 和 > 它们分别表示比较字符串是否相等、不相等或者第一个字符串的第一个字符排序在第二个字符串的第一个字符的前面或后面。

字符串比较-1:
[beyes@localhost ~]$ [ "abc" = "abc" ]; echo $?
[beyes@localhost ~]$ [ "abc" = "def" ]; echo $?
1
0

字符串比较-2:
[beyes@localhost ~]$ [ "abc" \> "def" ]; echo $?
1
[beyes@localhost ~]$ [ "gabc" \> "defz" ]; echo $?
0
[beyes@localhost ~]$ [ "gabc" \< "xefz" ]; echo $?
0
主意上面的比较,> 号前面加了 "\" 是因为 > 和 < 符号具有重定向功能,所以在此需要进行转义。

-n 可以用来测试字符串长度是否为不为 0 ,比如:
[beyes@groad.net ~]$ string="hello"

[beyes@groad.net ~]$ if [ -n "$stringer" ]; then echo hello world; fi
[beyes@groad.net ~]$ if [ -n "$string" ]; then echo hello world; fi
hello world

下面是一些常见测试选项:
操作符特征
-d目录
-e存在(也可以用 -a)
-f普通文件
-h符号连接(也可以用 -L)
-p命名管道
-r可读
-s非空
-S套接字
-w可写
-N从上次读取之后已经做过修改

测试文件的新旧

1. FILE1 -ef FILE2 (测试文件 FILE1 是不是文件 FILE2 的硬连接):
[beyes@localhost ~]$ mkdir shell
[beyes@localhost ~]$ touch FILE1
[beyes@localhost ~]$ ln FILE1 FILE2
[beyes@localhost ~]$ [ FILE1 -ef FILE2 ]; echo $?
0

2. FILE1 -nt FILE2 (测试文件 FILE1 是否比 FILE2 新):
[beyes@localhost syscall]$ ll fork vfork
-rwxrwxr-x. 1 beyes beyes 5663 May 26 19:47 fork
-rwxrwxr-x. 1 beyes beyes 5673 May 27 05:48 vfork
[beyes@localhost syscall]$ [ fork -nt vfork ]; echo $?
1

3. FILE1 -ot FILE2 (测试文件 FILE1 是否比 FILE2 旧):
[beyes@localhost syscall]$ ll fork vfork
-rwxrwxr-x. 1 beyes beyes 5663 May 26 19:47 fork
-rwxrwxr-x. 1 beyes beyes 5673 May 27 05:48 vfork
[beyes@localhost syscall]$ [ fork -ot vfork ]; echo $?
0



EXPRESSION1 -a EXPRESSION2 (EXPRESSION1 和 EXPRESSION2 要同时为真整个表达式才为真):
[beyes@localhost syscall]$ [ 9 -gt 8 -a 10 -gt 9 ]; echo $?
0
[beyes@localhost syscall]$ [ 9 -gt 8 -a 10 -gt 11 ]; echo $?
1

EXPRESSION1 -o EXPRESSION2 (EXPRESSION1 和 EXPRESSION2 只要有一个为真整个表达式则为真):
[beyes@localhost syscall]$ [ 9 -gt 8 -o 10 -gt 11 ]; echo $?
0

! EXPRESSION (表示对表达式取反)
[beyes@localhost syscall]$ [ \( "a" = "$HOME" -o 3 -lt 4 \) ]; echo $?
0
[beyes@localhost syscall]$ [ ! \( "a" = "$HOME" -o 3 -lt 4 \) ]; echo $?
1
上面的比较主意两点,1 是表示取反的 "!" 符号和表达式之间要有一个空格;2 是括号前面要用 "\" 进行转义,这是因为 shell 中常会在子 shell 里运行括号中的表达式;如果不使用 "\" 符号转义,那么也可以用单引号或双引号将括号包含起来:
[beyes@localhost syscall]$ [ ! \( "a" = "b" -o '(' 3 -lt 4 ")" ")" ]; echo $?
1
[beyes@localhost syscall]$ [ ! \( "a" = "b" -o '(' 3 -lt 4 ')' ")" ]; echo $?
1
主意上面的括号,左括号和右括号即使所用的包含符号(单引号,双引号,转义符号)不一致也是可以的。

测试 shell 选项
关于 shell 选项,可参考 set 命令:http://www.groad.net/bbs/read.php?tid-3619.html

比如:
[beyes@localhost ~]$ set -o noglob
[beyes@localhost ~]$ [ -o noglob ]; echo $?
0
[beyes@localhost ~]$ set +o noglob

[beyes@localhost ~]$ [ -o noglob ]; echo $?
1


如果要进行字符串比较,那么最好是用双中括号([[ ]]),因为单中括号([ ]) 有时容易引起一些错误。下面是一些比较例子:

[[ $str1 = $str2 ]]
如果 str1 和 str2 相等,也就是 str1 和 str2 的内容一样,那么测试返回真。还可以写成:[[ $str1 == $str2 ]] 。

[[ $str1 != $str2 ]]
如果 str1 和 str2 不一样那么返回真。

[[ $str1 > $str2 ]]
如果 str1 大于 str2 (ASCII 上的比较)那么返回真。

[[ $str1 < $str2 ]]
如果 str1 晓瑜 str2 (ASCII 上的比较)那么返回真。

[[ -z $str1 ]]
如果 str1 是一个空字符串那么返回真。

[[ -n $str1 ]]
如果 str1 是一个非空字符串,那么返回真。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2024-5-15 17:39 , Processed in 0.080216 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表