现在的位置: 首页 > 综合 > 正文

shell条件测试

2013年07月03日 ⁄ 综合 ⁄ 共 1694字 ⁄ 字号 评论关闭
    写脚本时,有时要判断字符串是否相等,可能还要检查文件状态或是数字测试。基于这些测试才能做进一步动作。
1、文件测试
测试文件状态的操作符如下:

-d 目录    -s 文件长度大于0、非空

-f 正规文件 -w 可写

-L 符号连接 -u 文件有suid位设置

-r 可读    -x 可执行

测试时使用逻辑操作符
测试文件状态是否为OK,但是有时要比较两个文件状态。shell提供三种逻辑操作完成此功能。
-a 逻辑与,操作符两边均为真,结果为真,否则为假。
-o 逻辑或,操作符两边一边为真,结果为真,否则为假。
! 逻辑否,条件为假,结果为真。
下面比较两个文件:


[root@localhost ~]# ls -l results.txt scores.txt       

-rwxr-xr-x 1 root root 0 Nov 21 12:22 results.txt

-rw-r--r-- 1 root root 0 Nov 21 12:15 scores.txt

下面的例子测试两个文件是否均可读。

  1. [root@localhost ~]# [ -w results.txt -a -w scores.txt ]
  2. [root@localhost ~]# echo $?
  3. 0

结果为真。

2、字符串测试

字符串测试是错误捕获很重要的一部分,特别在测试用户输入或比较变量时尤为重要。
字符串测试的操作符有三种。

== 两个字符串相等

!= 两个字符串不等

-z 字符串为空

-n 非空字符串

3、测试数值
测试数值可以使用许多操作符,可以是:


 -eq 数值相等     

 -ne 数值不相等    

 -gt 第一个数大于第二个数

-lt 第一个数小于第二个数        

-le 第一个数小于等于第二个数        

-ge 第一个数大于等于第二个数

下面的例子返回结果都一样。均为测试两个数是否相等(130是否等于130)。
  1. [root@localhost ~]# NUMBER=130
  2. [root@localhost ~]# [ "$NUMBER" -eq "130" ]
  3. [root@localhost ~]# echo $?
  4. 0

结果果然正确。

可以不必将整数值放入变量,直接用数字比较即可,但要加引号。
  1. [root@localhost ~]# [ "990" -le "995" ]
  2. [root@localhost ~]# echo $?
  3. 0

可以用逻辑操作符将两个测试表达式结合起来。仅需要用到一对方括号,而不能用两个,否则将返回错误信息“ too many arguments”。

  1. [root@localhost ~]# [ "990" -le "995" ] -a [ "123"  -gt "33" ]
  2. -bash: [: too many arguments

下面例子测试两个表达式,如果都为真,结果为真,正确使用方式应为:

  1. [root@localhost ~]# [ "990" -le "995" -a "123"  -gt "33" ]      
  2. [root@localhost ~]# echo $?
  3. 0

4、test、[] 、[[]]、(())的异同

[[ 是 bash 程序语言的关键字,而其他是内建命令!

$ type [ [[ test
[ is a shell builtin
[[ is a shell keyword
test is a shell builtin
    绝大多数情况下,这个三个功能通用。但是命令和关键字总是有区别的。命令和 关键字的差别有多大呢?
    如果是命令,它把参数作为比较表达式或文件测试,并且根据比较结果,返回一个退出码。那样比如 ">" "<" 就被 shell 解释为重定向符号了。关键字却不这样。关键字把整个表达式看作一个单独的元素,并且返回一个退出码。[[]]结构比[]更灵活,是一个扩展的test命令。
    (())可以应用于算术表达式的运算,并将结果作为退出码。如果表达式结果为0,则返回1作为退出码,否则返回0作为退出码。

参考:

http://jianlee.ylinux.org/Computer/Shell/shell_test.html

http://bbs.chinaunix.net/thread-1820304-1-1.html

《Advanced Bash-Scripting Guide》


转载请注明原载地址:http://blog.csdn.net/xinhanggebuguake

抱歉!评论已关闭.