对文件、字符串和数字使用test命令。
对数字和字符串使用expr命令。
expr命令测试和执行数值输出。使用最后退出状态命令 $? 可测知tes t和expr,二者均以0表示正确,1表示返回错误。
expr用法
expr命令一般用于整数值,但也可用于字符串。一般格式为:
expr argument operator argument
expr也是一个手工命令行计数器。
# expr 10 + 10
20
# expr 1500 + 900
2500
# expr 30 / 3
10
# expr 30 / 3 / 2
5
(注意运算符左右都有空格)
使用乘号时,必须用反斜线屏蔽其特定含义。因为shell可能会误解显示星号的意义。
# expr 30 * 3
(正确操作)
# expr 5 \* 4
增量计数
expr在循环中用于增量计算。首先,循环初始化为0,然后循环值加1,反引号的用法意
即替代命令。最基本的一种是从(expr)命令接受输出并将之放入循环变量。
# LOOP=0
# LOOP=`expr $LOOP + 1`
数值测试
可以用expr测试一个数。如果试图计算非整数,将返回错误。
# rr=1.1
# expr $rr + 1
expr: non-numeric argument
$rr=2
# expr $rr + 1
3
这里需要将一个值赋予变量(不管其内容如何),进行数值运算,并将输出导入dev/null,
然后测试最后命令状态,如果为0,证明这是一个数,其他则表明为非数值。
# value=12
# expr $value + 10 > /dev/null 2>&1
# echo $?
0
这是一个数。
# value=hello
# expr $value + 10 > /dev/null 2>&1
# echo $?
2
这是一个非数值字符。
expr也可以返回其本身的退出状态,不幸的是返回值与系统最后退出命令刚好相反,成
功返回1,任何其他值为无效或错误。下面的例子测试两个字符串是否相等,这里字符串为
“hello”和“hello”。
# value=hello
# expr $value = "hello"
1
# echo $?
0
expr返回1。不要混淆了,这表明成功。现在检验其最后退出状态,返回0表示测试成功,
“hello”确实等于“hello”。
test用法
test一般有两种格式,即:test condition 或 [ condition ] 。使用方括号时,要注意在条件两边加上空格。
常用文件状态测试:
- d 目录
- s 文件长度大于0、非空
- f 正规文件
- w 可写
- L 符号连接
- u 文件有suid位设置
- r 可读
- x 可执行
- c 字符设备文件
使用两种方法测试文件scores.txt是否可写并用最后退出状态测试是否成功。记住:0表示成功,其他为失败。
[root@localhost ~]# ls -l
-rw-r--r-- 1 root root 5 Sep 21 18:43 scores.txt
[root@localhost ~]# [ -w scores.txt ]
[root@localhost ruby]# echo $?
0
[root@localhost ~]# test -w scores.txt
[root@localhost ~]# echo $?
0
注意,这个的是否读、写、执行是根据当前用户对这个文件所拥有的权限而言的。如果我们换另一个用户,结果就不一定了。
测试时使用逻辑操作符
-a 逻辑与,操作符两边均为真,结果为真,否则为假。
-o 逻辑或,操作符两边一边为真,结果为真,否则为假。
! 逻辑否,条件为假,结果为真。
[root@localhost ~]# ls -l
-rw-r--r-- 1 root root 0 Sep 21 19:39 a
-rw-r--r-- 1 root root 0 Sep 21 19:39 b
[root@localhost ~]# [ -w a -a -x b ]
[root@localhost ~]# echo $?
1
[root@localhost ~]# [ -w a -o -x b ]
[root@localhost ~]# echo $?
0
[root@localhost ~]# [ ! -w a -o -x b ]
[root@localhost ~]# echo $?
1
字符串比较
= 两个字符串相等。
!= 两个字符串不等。
-z 空串。
-n 非空串。
[root@localhost ~]# a=""
[root@localhost ~]# [ -z $a ]
[root@localhost ruby]# echo $?
0
[root@localhost ~]# a="123"
[root@localhost ~]# [ -z $a ]
[root@localhost ~]# echo $?
1
[root@localhost ~]# [ -n $a ]
[root@localhost ~]# echo $?
0
测试数值
-eq 数值相等。
-ne 数值不相等。
-gt 第一个数大于第二个数。
-lt 第一个数小于第二个数。
-le 第一个数小于等于第二个数。
-ge 第一个数大于等于第二个数。
[root@localhost ~]# [ "123" -eq "123" -a "123" -ge "100" ]
[root@localhost ~]# echo $?
0
[root@localhost ~]# a=12
[root@localhost ~]# b=10
[root@localhost ~]# [ $a -gt $b ]
[root@localhost ~]# echo $?
0