条件测试
点击打开本章pdf文档 有时判断字符串是否相等或检查文件状态或是数字测试等。Test命令用于测试字符串,文件状态和数字。
测试文件状态
格式
test condition
或 [ condition ]
使用方括号时,要注意在条件两边加上空格。
常用的条件表达式为:
文件测试状态
-----------------------------------------------------------------------
-d 目录 -s 文件长度大于0、非空
-f 正规文件 -w 可写
-L 符号链接 -u 文件有suid位设置
-r 可读 -x 可执行
-z 字符串为空
-----------------------------------------------------------------------
测试的结果可以用$?的值来判断,0表示成功,其他为失败。
下面测试文件xaa是否可写:
[root@localhost test]# ls -l
-rw-r--r-- 1 root root 28 02-23 12:44 xaa
-rw-r--r-- 1 root root 28 02-23 12:44 xab
-rw-r--r-- 1 root root 28 02-23 12:44 xac
[root@localhost test]# [ -w xaa ]
[root@localhost test]# echo $?
0
证明是可写的.下面测试是否可运行:
[root@localhost test]# [ -x xaa ]
[root@localhost test]# echo $?
1
要测试其他的类似.
测试时使用逻辑操作符
-a 逻辑与,操作符两边均为真,结果为真,否则为假。
-o 逻辑或,操作符两边一边为真,结果为真,否则为假。
! 逻辑否,条件为假,结果为真。
下面的例子测试两个文件xaa和xab是否均可读.
[root@localhost test]# [ -w xab -a -w xac ]
[root@localhost test]# echo $?
0
测试xac是否可执行或者xab是否可写,使用逻辑或操作.
[root@localhost test]# [ -w xab -o -x xac ]
[root@localhost test]# echo $?
0
测试xac是否可执行而且xab是否可写,使用逻辑或操作.
[root@localhost test]# [ -w xab -a -x xac ]
[root@localhost test]# echo $?
1
字符串测试
5种格式:
test "string"
test string_operator "string"
test "string" string_operator "string"
[ string_operator string ]
[ string string_operator string ]
string_operator可为:
= 两个字符串相等
!= 两个字符串不等
-z 空串
-n 非空串
例如:
测试环境变量EDITOR是否为空:
[root@localhost test]# echo $EDITOR
[root@localhost test]# [ -z $EDITOR ]
[root@localhost test]# echo $?
0
返回为真,所以EDITOR是空.
修改EDITOR:
[root@localhost test]# EDITOR="vi"
[root@localhost test]# echo $EDITOR
vi
[root@localhost test]# [ -z $EDITOR ]
[root@localhost test]# echo $?
1
测试两个字符串:
[root@localhost test]# AAA="aaa"
[root@localhost test]# BBB="bbb"
[root@localhost test]# AAA1="aaa"
[root@localhost test]# [ "$AAA" = "$BBB" ]
[root@localhost test]# echo $?
1
[root@localhost test]# [ "$AAA" = "$AAA" ]
[root@localhost test]# echo $?
0
测试两个数值的大小:
格式:
"number" numberic_operator "number"
或者
[ "number" numberic_operator "number" ]
numberic_operator可为:
-eq 数值相等。
-ne 数值不相等。
-gt 第一个数大于第二个数。
-lt 第一个数小于第二个数。
-le 第一个数小于等于第二个数。
-ge 第一个数大于等于第二个数。
例如:
[root@localhost test]# NUMBER=130
[root@localhost test]# [ "$NUMBER" -eq "130" ]
[root@localhost test]# echo $?
0
expr用法
格式:
expr argument operator argument
可以作为手工计数器:
[root@localhost test]# expr 10 + 10
20
[root@localhost test]# expr 30/3
30/3
[root@localhost test]# expr 30 / 3
10
[root@localhost test]# expr 30 / 3 / 2
5
[root@localhost test]# expr 30 \* 3
90
注意:operator左右的数字要有空格:
如:
[root@localhost test]# expr 30/3
30/3
没有达到预期效果:而且使用乘号时也要用反斜线屏蔽其特殊意义.
expr还可用于锃亮计算,如一个循环体需要循环次数:
LOOP=0
LOOP=`expr $LOOP + 1`
数值测试
VALUE_1=12
VALUE_2=13
expr $VALUE_1 > $VALUE_2
echo $?
1
字符串测试:
[root@localhost test]# VALUE="hello"
[root@localhost test]# expr $VALUE="hello"
hello=hello
[root@localhost test]# expr $VALUE = "hello"
1
[root@localhost test]# echo $?
0
有两点注意:
一是$VALUE = "hello"的等号左右的字符串要有空格,没有空格没有达到预期结果,如上所示;
二是用expr测试的返回结果真为1,假为0.与$?的结果相反.
模式匹配
使用expr通过指定冒号选项计算字符串中字符数 .".*"意即任何字符重复0次或多次.
[root@localhost test]# VALUE=accounts.doc
[root@localhost test]# expr $VALUE : '.*'
12
在expr中可以使用字符串匹配操作,这里使用模式 .doc抽取文件附属名。
[root@localhost test]# expr $VALUE : '\(.*\).doc'
accounts