2009-02-28

shell的测试

shell的测试格式和一般的语言的格式很不一样. 它是用test这个内置命令或者一对方括号'[ ]'来完成测试的.测试结果为真,就设置$?为0,否则就设置$?为1.

测试功能主要有下面几方面: 字符串比较,数值比较,对文件的一些属性的测试,以及逻辑的与或非

字符串比较用到的运算符类似于C语言的数值比较运算符,包括 '=' (只要一个等号), \<, \>, != ,字符串为空-e, 这符串不为空-n. 注意因为大于号'>'和小于号'<'本身是用于输入输出重定向的,所以这里要加转义字符.

$ [ a = a ] && echo hello
hello
$ [ a \< b ] && echo hello
hello
$ [ b \> a ] && echo hello
hello
$ [ b != a ] && echo hello
hello
$ test b != a && echo hello
hello
$ test -n b && echo hello
hello
$ b=""
$ test -e $b && echo hello
hello


数值的比较就不能用这些数学符号了,而要用 -gt 大于, -lt 小于, -ge 大于或等于, -le 小于或等于, -eq 等于, -ne 不等于

$ test 3 -gt 2 && echo hello
hello
$ test 3 -ne 2 && echo hello
hello


测试文件属性的比较多,这里只列出几个:-w 文件可写, -r 文件可读, -d 是目录......
$ test -w sed.test && echo hello
hello

$ test -r sed.test && echo hello
hello

$ test -d sed.test && echo hello ||echo world
world

多个条件可以通过-a 与, -o 或, ! 非 组合起来.(注意下面比较的数字是被作字符串来比较的)
$ [ 3 \> 2 -a ! 2 \> 4 ] && echo hello
hello

用'\( \)'可以改变测试的优先级. 注意括号要加转义字符,因为括号本身是用在sub shell中的.
$ [ 3 \> 2 -a \( 2 \> 4 -o 6 \> 5 \) ] && echo hello
hello


可以看到,用test和方括号进行测试在形式上非常不自然. '[[ ]]'克服了这一缺点.在'[[ ]]'中,在对字符串进行比较时,大于号,小于号,括号都不用加转义字符了,而且还可以使用&&和||取代-a和-o.但是在数值比较上,它仍然要使用和'[ ]'一样的运算符(-gt, -lt等)
$ [[ 13 > 2 ]] && echo hello

$ [[ 13 -gt 2 ]] && echo hello
hello


'[[ ]]'没有为数值比较带来方便,但是'(( ))'做到了. 在'(( ))'里,一切的语法都和C语言的一样,非常方便.
$ (( 3 >4 )) && echo hello

$ (( 3 > 2 )) && echo hello
hello

$ (( 3 != 2 )) && echo hello
hello

$ (( 3 = 2 )) && echo hello
bash: ((: 3 = 2 : attempted assignment to non-variable (error token is "= 2 ")

$ (( 3 == 2 )) && echo hello

当然'(( ))'还可以用在其他地方,例如变量的赋值和for循环等地方
$ x=$((3**2))

$ echo $x
9

$ for (( i=0; i < 3; i++ ));do
> echo $i
> done
0
1
2





转载请注明出处 http://fornote.blogspot.com/

没有评论:

发表评论