专注各种脚本编程
Baidu
加入收藏夹
本站内容有下面分类知识,欢迎您的到来^_^
shell相关:指令篇 基础篇 脚本欣赏 编程实例 shell问问 shell视频教程 技巧篇 水平测试 E文资料 vi编辑器 高级Bash脚本编程指南
其他:mysql perl c语言 oracle
当前位置:| 主页>高级Bash脚本编程指南>

7.3 其他比较操作

百度收藏 QQ搜藏

----------------
二元比较操作符,比较变量或者比较数字.注意数字与字符串的区别.

整数比较

-eq  等于,如:if [ "$a" -eq "$b" ]
-ne  不等于,如:if [ "$a" -ne "$b" ]
-gt  大于,如:if [ "$a" -gt "$b" ]
-ge  大于等于,如:if [ "$a" -ge "$b" ]
-lt  小于,如:if [ "$a" -lt "$b" ]
-le  小于等于,如:if [ "$a" -le "$b" ]
<  小于(需要双括号),如:(("$a" < "$b"))
<=  小于等于(需要双括号),如:(("$a" <= "$b"))
>  大于(需要双括号),如:(("$a" > "$b"))
>=  大于等于(需要双括号),如:(("$a" >= "$b"))

字符串比较
=  等于,如:if [ "$a" = "$b" ]
==  等于,如:if [ "$a" == "$b" ],与=等价
  注意:==的功能在[[]]和[]中的行为是不同的,如下:
  1 [[ $a == z* ]]    # 如果$a以"z"开头(模式匹配)那么将为true
  2 [[ $a == "z*" ]]  # 如果$a等于z*(字符匹配),那么结果为true
  3
  4 [ $a == z* ]      # File globbing 和word splitting将会发生
  5 [ "$a" == "z*" ]  # 如果$a等于z*(字符匹配),那么结果为true
  一点解释,关于File globbing是一种关于文件的速记法,比如"*.c"就是,再如~也是.
  但是file globbing并不是严格的正则表达式,虽然绝大多数情况下结构比较像.
!=  不等于,如:if [ "$a" != "$b" ]
  这个操作符将在[[]]结构中使用模式匹配.
<  小于,在ASCII字母顺序下.如:
  if [[ "$a" < "$b" ]]
  if [ "$a" \< "$b" ]
  注意:在[]结构中"<"需要被转义.
>  大于,在ASCII字母顺序下.如:
  if [[ "$a" > "$b" ]]
  if [ "$a" \> "$b" ]
  注意:在[]结构中">"需要被转义.
  具体参考Example 26-11来查看这个操作符应用的例子.
-z  字符串为"null".就是长度为0.
-n  字符串不为"null"
  注意:
  使用-n在[]结构中测试必须要用""把变量引起来.使用一个未被""的字符串来使用! -z
  或者就是未用""引用的字符串本身,放到[]结构中(见Example 7-6)虽然一般情况下可
  以工作,但这是不安全的.习惯于使用""来测试字符串是一种好习惯.[1]

Example 7-5 数字和字符串比较
################################Start Script#######################################
 1 #!/bin/bash
 2
 3 a=4
 4 b=5
 5
 6 #  这里的变量a和b既可以当作整型也可以当作是字符串.
 7 #  这里在算术比较和字符串比较之间有些混淆,
 8 #+ 因为Bash变量并不是强类型的.
 9
10 #  Bash允许对整型变量操作和比较
11 #+ 当然变量中只包含数字字符.
12 #  但是还是要考虑清楚再做.
13
14 echo
15
16 if [ "$a" -ne "$b" ]
17 then
18   echo "$a is not equal to $b"
19   echo "(arithmetic comparison)"
20 fi
21
22 echo
23
24 if [ "$a" != "$b" ]
25 then
26   echo "$a is not equal to $b."
27   echo "(string comparison)"
28   #     "4"  != "5"
29   # ASCII 52 != ASCII 53
30 fi
31
32 # 在这个特定的例子中,"-ne"和"!="都可以.
33
34 echo
35
36 exit 0
################################End Script#########################################

Example 7-6 测试字符串是否为null
################################Start Script#######################################
 1 #!/bin/bash
 2 #  str-test.sh: 测试null字符串和非引用字符串,
 3 #+ but not strings and sealing wax, not to mention cabbages and kings . . .
 4 #+ 上边这句没看懂
 5 # Using   if [ ... ]
 6
 7
 8 # 如果一个字符串没被初始化,那么它就没有定义的值(像这种话,总感觉像屁话)
 9 # 这种状态叫做"null"(与zero不同)
10
11 if [ -n $string1 ]    # $string1 没被声明和初始化
12 then
13   echo "String \"string1\" is not null."
14 else 
15   echo "String \"string1\" is null."
16 fi 
17 # 错误的结果.
18 # 显示$string1为非空,虽然他没被初始化.
19
20
21 echo
22
23
24 # 让我们再试一下.
25
26 if [ -n "$string1" ]  # 这次$string1被引用了.
27 then
28   echo "String \"string1\" is not null."
29 else 
30   echo "String \"string1\" is null."
31 fi                    # ""的字符串在[]结构中
32
33
34 echo
35
36
37 if [ $string1 ]       # 这次$string1变成"裸体"的了
38 then
39   echo "String \"string1\" is not null."
40 else 
41   echo "String \"string1\" is null."
42 fi 
43 # 这工作得很好.
44 # 这个[]test操作检测string是否为null.
45 # 然而,使用("$string1")是一种很好的习惯
46 #
47 # As Stephane Chazelas points out,
48 #    if [ $string1 ]    有1个参数 "]"
49 #    if [ "$string1" ]  有2个参数,空的"$string1"和"]"
50
51
52
53 echo
54
55
56
57 string1=initialized
58
59 if [ $string1 ]       # 再来,$string1"裸体了"
60 then
61   echo "String \"string1\" is not null."
62 else 
63   echo "String \"string1\" is null."
64 fi 
65 # 再来,给出了正确的结果.
66 # 不过怎么说("$string1")还是好很多,因为. . .
67
68
69 string1="a = b"
70
71 if [ $string1 ]       # 再来,$string1 再次裸体了.
72 then
73   echo "String \"string1\" is not null."
74 else 
75   echo "String \"string1\" is null."
76 fi 
77 # 非引用的"$string1"现在给出了一个错误的结果!
78
79 exit 0
80 # Thank you, also, Florian Wisser, for the "heads-up".
################################End Script#########################################

Example 7-7 zmore
################################Start Script#######################################
 1 #!/bin/bash
 2 # zmore
 3
 4 #使用'more'来查看gzip文件
 5
 6 NOARGS=65
 7 NOTFOUND=66
 8 NOTGZIP=67
 9
10 if [ $# -eq 0 ] # 与 if [ -z "$1" ]同样的效果
11 # 应该是说前边的那句注释有问题,$1是可以存在的,比如:zmore "" arg2 arg3
12 then
13   echo "Usage: `basename $0` filename" >&2
14   # 错误消息到stderr
15   exit $NOARGS
16   # 脚本返回65作为退出码.
17 fi 
18
19 filename=$1
20
21 if [ ! -f "$filename" ]   # 将$filename ""起来,来允许可能的空白
22 then
23   echo "File $filename not found!" >&2
24    # 错误消息到stderr
25   exit $NOTFOUND
26 fi 
27
28 if [ ${filename##*.} != "gz" ]
29 # 在变量替换中使用中括号
30 then
31   echo "File $1 is not a gzipped file!"
32   exit $NOTGZIP
33 fi 
34
35 zcat $1 | more
36
37 # 使用过滤命令'more'
38 # 如果你想的话也可使用'less'
39
40
41 exit $?   # 脚本将返回pipe的结果作为退出码
42 # 事实上,不用非的有"exit $?",但是不管怎么说,有了这句,能正规一些
43 # 将最后一句命令的执行状态作为退出码返回
################################End Script#########################################

混合比较

-a  逻辑与
  exp1 -a exp2 如果exp1和exp2都为true的话,这个表达式将返回true

-o  逻辑或
  exp1 -o exp2 如果exp1和exp2中有一个为true的话,那么这个表达式就返回true

这与Bash的比较操作符&&和||很相像.在[[]]中使用它.
  1 [[ condition1 && condition2 ]]
-o和-a一般都是和test命令或者是[]一起工作.
  1 if [ "$exp1" -a "$exp2" ]

请参考Example 8-3,Example 26-16和Example A-28来查看混合比较操作的行为.

注意事项:
[1]  S.C.(这家伙是个人名)指出,在使用混合比较的时候即使"$var"也可能会产生问题.
  如果$string为空的话,[ -n "$string" -o "$a" = "$b" ]可能在某些版本的Bash中
  会有问题.为了附加一个额外的字符到可能的空变量中的一种安全的办法是,
  [ "x$string" != x -o "x$a" = "x$b" ](the "x's" cancel out)(没看懂).
  cancel out是抵消的意思.

上一篇:7.2 文件测试操作 下一篇:7.4 嵌套的if/then条件test

power by soyo123 2007-2008