shell条件测试


shell条件测试
 
 写脚本时,有时要判断字符串是否相等,可能还要检查文件状态或是数字测试。基于这些测试才能做进一步动作。
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
下面的例子测试两个文件是否均可读。
[root@localhost ~]# [ -w results.txt -a -w scores.txt ]
[root@localhost ~]# echo $?
0
结果为真。
2、字符串测试
字符串测试是错误捕获很重要的一部分,特别在测试用户输入或比较变量时尤为重要。
字符串测试的操作符有三种。
== 两个字符串相等
!= 两个字符串不等
-z 字符串为空
-n 非空字符串
3、测试数值
测试数值可以使用许多操作符,可以是:
 
 -eq 数值相等     
 -ne 数值不相等    
 -gt 第一个数大于第二个数
-lt 第一个数小于第二个数        
-le 第一个数小于等于第二个数        
-ge 第一个数大于等于第二个数
下面的例子返回结果都一样。均为测试两个数是否相等(130是否等于130)。
[root@localhost ~]# NUMBER=130
[root@localhost ~]# [ "$NUMBER" -eq "130" ]
[root@localhost ~]# echo $?
0
结果果然正确。
可以不必将整数值放入变量,直接用数字比较即可,但要加引号。
[root@localhost ~]# [ "990" -le "995" ]
[root@localhost ~]# echo $?
0
可以用逻辑操作符将两个测试表达式结合起来。仅需要用到一对方括号,而不能用两个,否则将返回错误信息“ too many arguments”。
[root@localhost ~]# [ "990" -le "995" ] -a [ "123"  -gt "33" ]
-bash: [: too many arguments
下面例子测试两个表达式,如果都为真,结果为真,正确使用方式应为:
[root@localhost ~]# [ "990" -le "995" -a "123"  -gt "33" ]      
[root@localhost ~]# echo $?
0
4、test、[] 、[[]]、(())的异同
[[ 是 bash 程序语言的关键字,而其他是内建命令!
$ type [ [[ test
[ is a shell builtin
[[ is a shell keyword
test is a shell builtin
    绝大多数情况下,这个三个功能通用。但是命令和关键字总是有区别的。命令和 关键字的差别有多大呢?
    如果是命令,它把参数作为比较表达式或文件测试,并且根据比较结果,返回一个退出码。那样比如 ">" "<" 就被 shell 解释为重定向符号了。关键字却不这样。关键字把整个表达式看作一个单独的元素,并且返回一个退出码。[[]]结构比[]更灵活,是一个扩展的test命令。
    (())可以应用于算术表达式的运算,并将结果作为退出码。如果表达式结果为0,则返回1作为退出码,否则返回0作为退出码。
 

相关内容

    暂无相关文章