展望2011

2007-04-20 | linux的test命令[转]

上一篇 / 下一篇  2007-04-27 22:41:11 / 个人分类:操作系统

C/T:P es#Is`1GcF0linuxtest命令(转)51Testing软件测试网F7}e`0@Ms)L(Q)w

51Testing软件测试网8BZ5yM [U'~

出处:http://www.oracle.com/technology/global/cn/pub/articles/dulaney_test.html

$qc@h!W"XlE:{;K0

)ic8e&?p iR0每一种条件语句的基础都是判断什么是真什么是假。是否了解其工作原理将决定您编写的是质量一般的脚本还是您将引以为荣的脚本。51Testing软件测试网.XBY+?Y O

51Testing软件测试网R.Q[D{|3g,fy

Shell 脚本的能力时常被低估,但实际上其能力的发挥受制于脚本撰写者的能力。您了解得越多,您就越能像变戏法似地撰写一个文件来使任务自动化和简化您的管理工作。

P8W\'xjo'rwn0

"tQ"Zbow)o k1Wdc0在 shell 脚本中进行的每一种操作(除最简单的命令编组之外)都需要检查条件。所有的 shell 脚本“逻辑” — 广义意义下的“逻辑” — 通常都可以分为以下三大类:

4k6~H#ws2bp0Z051Testing软件测试网_j3i})XL

if {condition exists} then ...
0w2C oe7^0while {condition exists} do ...51Testing软件测试网/n z/j!H$~emydxgB
until {condition exists} do ...

p2~S*O ?&aL0

x~/Br!x%neP0无论随后的操作是什么,这些基于逻辑的命令都依靠判断一种条件是否真实存在来决定后续的操作。test 命令是使得在每一种情况下都能够确定要判断的条件是否存在的实用工具。因此,彻底了解这个命令对于撰写成功的 shell 脚本至关重要。51Testing软件测试网"k4e^&F bb\M&{

51Testing软件测试网2fef)Zz3}1pX

工作原理51Testing软件测试网aWv0j9pD

51Testing软件测试网|O:_t^

test 命令最短的定义可能是评估一个表达式;如果条件为真,则返回一个 0 值。如果表达式不为真,则返回一个大于 0 的值 — 也可以将其称为假值。检查最后所执行命令的状态的最简便方法是使用 $? 值。出于演示的目的,本文中的例子全部使用了这个参数。51Testing软件测试网$_I \vD d vOk;Ur

+[#R*h0o X?_)D0test 命令期望在命令行中找到一个参数,当 shell 没有为变量赋值时,则将该变量视为空。这意味着在处理脚本时,一旦脚本寻找的参数不存在,则 test 将报告该错误。

2fE#}*b K0

(p q o'Z+B5y:T9U7}0当试图保护脚本时,您可以通过将所有参数包含在双引号中来解决这个问题。然后 shell 将变量展开,如果变量没有值,那么将传递一个空值给 test。另一种方法是在脚本内增加一个额外检查过程来判断是否设置了命令行参数。如果没有设置命令行参数,那么脚本会告诉用户缺少参数,然后退出。我们会通过一些例子来更具体地说明所有这些内容。

H&Ft,m^,s:d5^051Testing软件测试网yrD3G B1e fX

test 和 [ 命令51Testing软件测试网aIBB&}/?$N9Gm1]

51Testing软件测试网T rO J~8C"a

虽然 Linux 和 UNIX 的每个版本中都包含 test 命令,但该命令有一个更常用的别名 — 左方括号:[。test 及其别名通常都可以在 /usr/bin 或 /bin (取决于操作系统版本和供应商)中找到。51Testing软件测试网wkujd_&d

6n9ul1s_0当您使用左方括号而非 test 时,其后必须始终跟着一个空格、要评估的条件、一个空格和右方括号。右方括号不是任何东西的别名,而是表示所需评估参数的结束。条件两边的空格是必需的,这表示要调用 test,以区别于同样经常使用方括号的字符/模式匹配操作。51Testing软件测试网'eM2BG:A#YT'\

Ny%A7}R1~Y-\V^0test 和 [ 的语法如下:

)g'B7v9P/a051Testing软件测试网]2r@,k/| at

test expression51Testing软件测试网axF,Xb:nB4E
[ expression ]

v#VV6p,s2eHII'V-m&]051Testing软件测试网 e.oY L%B

在这两种情况下,test 都评估一个表达式,然后返回真或假。如果它和 if、while 或 until 命令结合使用,则您可以对程序流进行广泛的控制。不过,您无需将 test 命令与任何其它结构一起使用;您可以从命令行直接运行它来检查几乎任何东西的状态。

6o j;C4aph0

t$m7T7nRSPR'`0因为它们彼此互为别名,所以使用 test 或 [ 均需要一个表达式。表达式一般是文本、数字或文件和目录属性的比较,并且可以包含变量、常量和运算符。运算符可以是字符串运算符、整数运算符、文件运算符或布尔运算符 — 我们将在以下各部分依次介绍每一种运算符。51Testing软件测试网)[o hS I

51Testing软件测试网/{;EK"}K_ g2E

test 文件运算符51Testing软件测试网)Q~(|P9PI!@

:D i9fG']/m.H U8q]0利用这些运算符,您可以在程序中根据对文件类型的评估结果执行不同的操作:

1bD r-?KA$A K0

v1XZOG0-b file 如果文件为一个块特殊文件,则为真51Testing软件测试网zN2g4B ?%g6v]4R
-c file 如果文件为一个字符特殊文件,则为真
!f`E}pl0-d file 如果文件为一个目录,则为真51Testing软件测试网&x Q)M7JN R6n4\u
-e file 如果文件存在,则为真51Testing软件测试网:LM YYd~
-f file 如果文件为一个普通文件,则为真
yok c9J;v5z0-g file 如果设置了文件的 SGID 位,则为真51Testing软件测试网A#~N@9LO]
-G file 如果文件存在且归该组所有,则为真
-m]x/]f#Mf_s0bv0-k file 如果设置了文件的粘着位,则为真51Testing软件测试网rb6?c(y*B j_0}2Y1L
-O file 如果文件存在并且归该用户所有,则为真51Testing软件测试网'w v ~/_1A8Ke
-p file 如果文件为一个命名管道,则为真51Testing软件测试网;g/Y8`(lQf}
-r file 如果文件可读,则为真51Testing软件测试网/{0U+akNm0DEv/@M
-s file 如果文件的长度不为零,则为真
ya'[K)No0-S file 如果文件为一个套接字特殊文件,则为真
@#QM.D@d$U C%h0-t fd 如果 fd 是一个与终端相连的打开的文件描述符(fd 默认为 1),则为真
7tI/m(cM.m6f)L+U0-u file 如果设置了文件的 SUID 位,则为真
B:}*xyk"{0-w file 如果文件可写,则为真51Testing软件测试网 q S Eu a2j(k
-x file 如果文件可执行,则为真51Testing软件测试网"kH#|1r6h Oc-ma

51Testing软件测试网]*V6Le5R)G&S

以下示例显示了此简单操作的运行情况:

$w,gd-G'i9A4~E'y051Testing软件测试网M4ipc cd

$ ls -l51Testing软件测试网D\l&x,P6F*\ n
total 33
8EAD'OTV!Pz?x0drwxr-xr-w 2 root root 1024 Dec 5 05:05 LST51Testing软件测试网l!zJ!_O D6y
-rw-rw-rw- 1 emmett users 27360 Feb 6 07:30 evan
'm$u6AgJ3]:g3^Wn0-rwsrwsrwx 1 root root 152 Feb 6 07:32 hannah51Testing软件测试网.Ha6zO}f9Yn
drwxr-xr-x 2 emmett users 1024 Feb 6 07:31 karen
Y R Rxpf0-rw------- 1 emmett users 152 Feb 6 07:29 kristin51Testing软件测试网'L1e*p%t;AY K;p
-rw-r--r-- 1 emmett users 152 Feb 6 07:29 spencer51Testing软件测试网JgUc H u%_
$

E!I{WA7yi0

5R(z:uN&p Kp0$ test -r evan51Testing软件测试网k7Q | y:{z;tfE
$ echo $?51Testing软件测试网 M8D3do6[` \7D.c
0

7r,G-Y&U{G4v0

(~ w&zLZlm3Z(k G#h}0$ test -r walter
R)Q:w4_ n#e8ln0$ echo $?51Testing软件测试网4v~Goz*J_:L Cw ^
151Testing软件测试网g)QXh9@q
$

^e+`Z!v2k U.^051Testing软件测试网)],Ja%d1u2n

由于第一次评估为真 — 文件存在且可读 — 返回值为真,或 0。由于第二次评估的文件不存在,该值为假,返回值不为零。将值指定为零或非零很重要,因为在失败时不会始终返回 1(虽然这是通常返回的值),可能返回一个非零值。51Testing软件测试网0R]#ZfdT

51Testing软件测试网{(q'MU"lDOR

正如开头所提到的,除了使用 test 外,您还可以用方括号 [ ] 将命令括住来向 shell 发出同样的命令 — 如下所示:

+}h!wp2u;ap&`8R0

saT o nm-Q-I0$ [ -w evan ]
)ZxA}k~i:mwV+z0$ echo $?
5mx'j/d6J NF#n00
L)U5zJ.J O0$ [ -x evan ]
YM rG:AuL0$ echo $?51Testing软件测试网 a&y^CO:n-Z-d;t
1
;qU M\:wJ7~.O{0$

v8iH8y*D6n8i`zk0

q3tw*|&OK"I0同样,第一个表达式为真,第二个表达式为假 — 正如返回值所指示的那样。您还可以使用以下命令将两个文件彼此进行比较:51Testing软件测试网-|RR[ \!dCl4@

Tm"nM2v7| n0file1 -ef file2 测试以判断两个文件是否与同一个设备相连,是否拥有相同的 inode 编号
k U4iK{ }[0file1 -nt file2 测试以判断第一个文件是否比第二个文件更新(由修改日期决定)51Testing软件测试网(}zYMXd
file1 -ot file2 测试以判断第一个文件是否比第二个文件更旧

%z2vkA)a{0e0

6E Y?p Z iro0以下示例显示了使用这些运算符比较文件的结果:

9WA"w3Ald-~051Testing软件测试网K~%HE~&J _U

$ [ evan -nt spencer ]
8R*U%R/}E:D8h`2em0$ echo $?51Testing软件测试网%b @ m'uC@U
0
S)YU/xsJ"M)G3?0$ [ karen -ot spencer ]
0yuoL3|2MY0$ echo $?
K4Cv^ N!w#R(e"e01
k Ui,c@0izI`0$

)P_5Q/\u$Y051Testing软件测试网Hh%\wi-B.iY1tmm

名为 evan 的文件比名为 spencer 的文件更新,因而评估为真。类似地,名为 karen 的文件比名为 spencer 的文件更新,因此该评估为假。

6?C @Km:Q,K*a0

_m3^H(k2O-@)S*vp d0字符串比较运算符

R"a1k M9jB r \*_D0

O5g$z#{P0如标题所示,这组函数比较字符串的值。您可以检查它们是否存在、是否相同或者是否不同。

#L$WVR)P7b0

#g;]E;RzX yY9V$q0String 测试以判断字符串是否不为空
,oA3ry F{U{0Z0-n string 测试以判断字符串是否不为空;字符串必须为 test 所识别
D'na P!U'WHO({Vs P0-z string 测试以判断字符串是否为空;字符串必须为 test 所识别
R0i9c Y$`X3Q'O0string1 = string2 测试以判断 string1 是否与 string2 相同
d)o6aN|!fWz$j0string1 != string2 测试以判断 string1 是否与 string2 不同51Testing软件测试网;tT,_l!}4K'WuF

51Testing软件测试网j%[1A3tt0lB/L6Aj5gIa

对任何变量进行的最有用的测试之一是判断它的值是否不为空,可以简单地将其放在 test 命令行中执行这种测试,如下例所示:

| S Bw.C.N6R0

2f+S vkL-\D O{L0$ test "$variable"

mii(W,d@f051Testing软件测试网ve6uTQ0g*XQ

强烈建议进行此种测试时用双引号将变量括住,以让 shell 识别变量(即使变量为空)。默认情况下执行的基本字符串评估和 -n 测试从功能上讲是相同的,如以下示例所示:51Testing软件测试网 G{*~7QC0P6o

s'|S3JTf0#example1
qQ Z"x pN)hJ0if test -n "$1"
pVv U;zk aS1K0then
a(jDK7J9j5U;o0echo "$1"
.y|c`5O?`0fi51Testing软件测试网)CR.gNo|.m&AuU-w

51Testing软件测试网0{#CQG#z.rY.~1X*Jz

执行以上例子中的代码将根据 $1 是否存在给出以下结果:51Testing软件测试网q(m4p}%K)]

'C+D ~yoQP5k0$ example1 friday
/|M-i~vt lV W)V0friday51Testing软件测试网^+tT/l4sc
$51Testing软件测试网'r#^k TJ;[n#m w(S
$ example1
,mS|Yix7ldk0$

8R#q|+l2v'D0g%c*Gv C0

8@!G%m|y\0如果将代码更改为以下形式,则结果将相同:

T R%J!^0GH!iv$z8K051Testing软件测试网1OK'M{|S9]1|

#example2
R)x(j w&Ae1pU0if test "$1"51Testing软件测试网B7fQ+w7X1I
then51Testing软件测试网)vCf;g_;L6u O!|
echo "$1"51Testing软件测试网UPZCT(]9tV
fi

4L4B.i.~8U-bl051Testing软件测试网Y^4|$_t:@

如下所示:

7K `3yLo y'o0

:oi n4T,GST0$ example2 friday51Testing软件测试网X!R'r,RD]s
friday
3mqS!f8N{|0$51Testing软件测试网Z!kAH/F;ce1W
$ example2
'XZDg4YNVq+w0$

"_1E dvE"x#G_051Testing软件测试网;V;@FCI_HN ^

所有这些表明,通常不需要 -n,它代表默认操作。51Testing软件测试网1Dvp U d/@\ | @

6uaP/V.eE0要从一个不同的角度来查看各种可能性,您可以用另一个选项来替换 -n,并检查该值是否为空(相对于非空)。这可以用 -z 选项来实现,代码为:

?]af jp&\ q051Testing软件测试网_*G&niP8Aw(~l

#example351Testing软件测试网7{8q1m g L{N4X ^:@
if test -z "$1"51Testing软件测试网-dpXJ:r m0R
then51Testing软件测试网 E#c\R5K!g0}
echo "no values were specified"
;u,GX'Ep"DF0fi51Testing软件测试网 {l2KQ0uhJ

51Testing软件测试网NbTJ f.Z/S+xr

运行如下:51Testing软件测试网wM d?o3y:ZU|r

|4d VB,P8V0$ example351Testing软件测试网n1Vm#d H+Q+t
no values were specified51Testing软件测试网e2T s+dlh
$ example3 friday51Testing软件测试网.J;S;|3m^oo&J,c8N
$

0Bz6e;X[ H051Testing软件测试网#AVJ!eZ2z)a%A)_9M}&H

如果在没有命令行参数的情况下运行该程序,而表达式评估为真,那么将执行程序块中的文本。如果在命令行中有值,则脚本退出,不执行任何操作。将评估操作放在脚本的开头非常有用,这可以在可能产生错误的进一步处理之前预先检查变量值。

t:gW:{8X]f+`@051Testing软件测试网u'l2P_x2AN

其余的字符串运算符对两个变量/字符串之间的精确匹配或其中的差异(您也可以称之为等价性和“不等价性”)进行评估。第一个例子对匹配进行测试:51Testing软件测试网0lY_H$Glp*H

51Testing软件测试网9UI(D FF-A&m

$ env51Testing软件测试网 p*S9E5~s,OC
LOGNAME=emmett
h6q&RJ/K-P0PAGER=less
k[bv ^,t*m0SHELL=/bin/bash51Testing软件测试网8d V[ E$Q"N(i ?
TERM=linux
Z1~PH^'Yc2E.[ lL0$51Testing软件测试网l9f3q9N3RW
$ [ "$LOGNAME" = "emmett" ]
q/ch!MP6Jb;i C0$ echo $?
5Ld5A}tS0d v8e0051Testing软件测试网 w{G!^^.^$e
$
`nR0Kf aNl7khpP0$ [ "$LOGNAME" = "kristin" ]51Testing软件测试网z%h0yXs CD1W
$ echo $?51Testing软件测试网 Z*f7?g'j7Dw
1
)N5y e;e l:A'm0$

gx{ H;U051Testing软件测试网e o~Ac$i V7@#]e\

或者,该评估可以以脚本的形式用于决定是否运行脚本:51Testing软件测试网Mj#W"n#ETfxk*|t

51Testing软件测试网9M X2mJ3|%GkE~

#example451Testing软件测试网 Y:v$b-|~
if [ "$LOGNAME" = "emmett" ]51Testing软件测试网U'{;D^Kb
then51Testing软件测试网2AjEY0eWWgt
echo "processing beginning"
4|"n(G k1}3` ws0else51Testing软件测试网m"A o-S!IR*N
echo "incorrect user"
+]H,@L!D*PO0fi

h%^ym V5|t2y%k(x051Testing软件测试网:n(T:xYiT

这种方法可以用来寻找任意的值(如终端类型或 shell 类型),在允许脚本运行之前这些值必须匹配。请注意,= 或 != 运算符的优先级高于其它大多数可指定选项,且要求必须伴有表达式。因此,除了比较字符串的选项之外,= 或 != 都不能和检查某种东西(如可读文件、可执行文件或目录)的存在性的选项一起使用。51Testing软件测试网 R3`:HP9G+Z,E[cw|

(U3T!K+mX0整数比较运算符51Testing软件测试网_QY6n#hz9|/kBo9P

51Testing软件测试网nTNyF B;]8y

正如字符串比较运算符验证字符串相等或不同一样,整数比较运算符对数字执行相同的功能。如果变量的值匹配则表达式测试为真,如果不匹配,则为假。整数比较运算符不处理字符串(正如字符串运算符不处理数字一样):51Testing软件测试网W0L fmdu/F*yJf rR

6xiS2VX0int1 -eq int2 如果 int1 等于 int2,则为真
fL[ Jzf9O iW't0int1 -ge int2 如果 int1 大于或等于 int2,则为真
-^ w-ft:|ak0int1 -gt int2 如果 int1 大于 int2,则为真51Testing软件测试网 pk%w [rugq tr2F8v
int1 -le int2 如果 int1 小于或等于 int2,则为真51Testing软件测试网+W(Zn$@(ue J:e1G
int1 -lt int2 如果 int1 小于 int2,则为真51Testing软件测试网.l8kh8Pv?Jnb
int1 -ne int2 如果 int1 不等于 int2,则为真51Testing软件测试网 ZmeN.ou(U

0p M(N ^0B1}!G0以下示例显示了一个代码段,其中在命令行中给出的值必须等于 7:

7cH*W3s@(Za)a051Testing软件测试网1IM:QG}pp

#example551Testing软件测试网p*|j6ZQ3}
if [ $1 -eq 7 ]51Testing软件测试网'S;n%F-E(Bo
then51Testing软件测试网OPeq.dKn"M
echo "You've entered the magic number."51Testing软件测试网rC?kx;[{%i
else
A+tU7\ExP'`9\0echo "You've entered the wrong number."
@*c Z;G Sp A |0fi

mQj2b vO+N051Testing软件测试网sv's }/o5F3kd1M

运行中:51Testing软件测试网d |#kWb9gj

51Testing软件测试网!J U%mMea0C}vO

$ example5 6
ZTCe C$i&m` uj0You've entered the wrong number.51Testing软件测试网*R y)f.g9e&c
$
'H+A(l zzF5y0$ example5 7
,Q^.v$t7Y0A A0You've entered the magic number.
3hV(J$B8H3n Qwj0$

;B%n'\\#I?n0

6t-q[(qtS0和字符串一样,比较的值可以是在脚本外为变量赋的值,而不必总是在命令行中提供。以下示例演示了实现这一点的一种方法:

?&E^Xr!NLK0

2~0K;u*t nHt8p0#example651Testing软件测试网"e ] GXZ]r^
if [ $1 -gt $number ]51Testing软件测试网 cA5RC-P vtjD-ZY
then
o#e;a3A4[z%j.X0echo "Sorry, but $1 is too high."
1Al j1{u/FFg&G9d0else
0_Bm)y|8v[0echo "$1 will work."51Testing软件测试网1q}(?Rza1ne
fi51Testing软件测试网}d xm/X?,RF&bSt+H

$hM;b^*A0K0$ set number=751Testing软件测试网&V9Z{6L`M7j+zw
$ export number
3R^y4pi5oJ ?r0$ example6 8
}3u#}7_Hrs(n2^t7f_Q0Sorry, but 8 is too high.
]K J4B#q{rK1?&E0$ example6 7
|&pl:}o"D/~X;n:Z07 will work.
"y:X7?A.b,\.D9A.i t0$

Z5Ar.TV(u qe_ u051Testing软件测试网7Aa m!R/_

整数比较运算符最佳的用途之一是评估指定的命令行变量的数目,并判断它是否符合所要求的标准。例如,如果某个特定的命令只能在有三个或更少变量的情况下运行,

LK q(Qr0

cw$qsR0#example7 - display variables, up to three51Testing软件测试网y[i$r;y Q)sp:w
if [ "$#" -gt 3 ]51Testing软件测试网yn+Q p/Y
then
x L4t'[%^\$E0echo "You have given too many variables."51Testing软件测试网(TOQtl7]
exit $#
'y_,o7xI s-q0fi

6YRa2U+A0

oK V VfX1vdl0只要指定三个或更少的变量,该示例脚本将正常运行(并返回值 0)。如果指定了三个以上的变量,则将显示错误消息,且例程将退出 — 同时返回与命令行中给定的变量数相等的退出代码。51Testing软件测试网(w#yI(K#k7}2`4I

51Testing软件测试网(oCN9E)Ef s HS

对这个过程进行修改可以用来在允许运行报表之前判断当天是否是本月的最后几天:

st{M2V)N/|/Z(b0

7Tz3WZ*lW$IZb0#example8 - to see if it is near the end of the month#51Testing软件测试网n+FG f$mou%Nbw
set `date` # use backward quotes
!X-X^nR:b0if [ "$3" -ge 21 ]51Testing软件测试网!m]gN} U
then
w2bT4\.Pt6C7M/_P_R0echo "It is close enough to the end of the month to proceed"
-xt4F{t3R7~]6R0else51Testing软件测试网[ l2h2Af4Qr'l}
echo "This report cannot be run until after the 21st of the month"51Testing软件测试网dYt'X Byb3T![+e
exit $351Testing软件测试网!h1v _4qiS i
fi

L.m6Kj/T\y2_8{Sl051Testing软件测试网p4g5i/qMZ

在这个例子中,设置了六个变量(通过空格彼此分开):51Testing软件测试网 ju ~-~9fJ"Z{

1gL'M+t1Ae0$1 = Fri51Testing软件测试网/eHT$i+UR:Y3Jt }]"w
$2 = Feb51Testing软件测试网Qz$d'dK f
$3 = 6
9vl6K Oh2[%[2m C0$4 = 08:56:3051Testing软件测试网Fq6OLvK%N#L
$5 = EST
$M7{#t}}M5\$xa0$6 = 200451Testing软件测试网,[)n)Ir)}q

3l5gn:B3z3@0这些值可以在脚本中使用,就像它们是在命令行中输入的一样。请注意,退出命令再次返回一个值 — 在这种情况下,返回的值是从 $3 的值中得到的日期。这一技巧在故障诊断时会非常有用 — 如果您认为脚本应该运行而没有运行,那么请查看 $? 的值。51Testing软件测试网S-\4M(hW| O,^4Q%g

51Testing软件测试网p5\*D Y#~

一种类似的想法可能是撰写一个只在每个月的第三个星期三运行的脚本。第三个星期三一定在该月的 15 日到 21 日之间。使用 cron,您可以调用脚本在 15 日到 21 日之间每天的一个指定时间运行,然后使用脚本的第一行检查 $1(在设置日期之后)的值是否为 Thu。如果为 Thu,那么执行剩下的脚本,如果不是,则退出。51Testing软件测试网yzEel

)_#hL!SFD:h#c(~O0而另一个想法可能是,只允许脚本在超过 6:00 p.m. (18:00),所有用户都回家之后运行。只要撰写脚本,使其在值低于 18 时退出,并通过使用以下命令来获取时间(将其设为 $1)

t L*wK#eM051Testing软件测试网-s0btpoY

set `date +%H`51Testing软件测试网3h;Mh fNLr@n

51Testing软件测试网t(f:^l`A5p

布尔运算符

[0j@\e)X?eG0

F z\Y%DD@Z0布尔运算符在几乎每种语言中的工作方式都相同 — 包括 shell 脚本。在 nutshell 中,它们检查多个条件为真或为假,或者针对假的条件而不是真的条件采取操作。与 test 搭配使用的运算符有

Qe/W:A}RZ |V~d0

r"O/|Z`1o8}0! expr 如果表达式评估为假,则为真51Testing软件测试网} L]8G/\5S{Szn
expr1 -a expr2 如果 expr1 和 expr2 评估为真,则为真51Testing软件测试网RY7d} x/i1Y
expr1 -o expr2 如果 expr1 或 expr2 评估为真,则为真

W_A V+U0

VAD}B_(vK0可以用 != 运算符代替 = 进行字符串评估。这是最简单的布尔运算符之一,对 test 的正常结果取非。

P#sN [ Nq051Testing软件测试网urGS$k

其余两个运算符中的第一个是 -a(即 AND)运算符。要使测试最终为真,两个表达式都必须评估为真。如果任何一个评估为假,则整个测试将评估为假。例如,

$MWO{X"~m#^051Testing软件测试网E!D7t:g lyQ4@

$ env51Testing软件测试网-TysqZ7u({
HOME=/
T J5j{:Oyy0LOGNAME=emmett
yDeA'k}k\l0MAIL=/usr/mail/emmett
\erq'W8vo0PATH=:/bin:/usr/bin:/usr/lbin51Testing软件测试网C/xI!l4RG&w9M%K3q3I;L
TERM=linux51Testing软件测试网vW"V_a!q} ^mE
TZ=EST5:0EDT51Testing软件测试网d}0h_FT
$
4p:S `5w[n0$ [ "$LOGNAME" = "emmett" -a "$TERM" = "linux" ]51Testing软件测试网#g"G8m#Y#A/yA;` c{
$ echo $?
b#T_}\&t#ub0051Testing软件测试网Cf"B&CW$KB
$51Testing软件测试网[}*A4mv

vO8v-mv1`:\&G1f0$ [ "LOGNAME" = "karen" -a "$TERM" = "linux" ]51Testing软件测试网 jih3]%dD\
$ echo $?51Testing软件测试网D/qI$l/k
1
I$u_ N;Tv6QJ%j"U0$

O7{Yg5S&iM']b0

P!bP^1qk0在第一个评估中,两个条件都测试为真(在一个 linux 终端上登录的是 emmett),因此整个评估为真。在第二个评估中,终端检查正确但用户不正确,因此整个评估为假。51Testing软件测试网+py_/vm_n4h;S:q*[

51Testing软件测试网 k7]f5}!hw3|:i"}

简而言之,AND 运算符可以确保代码只在两个条件都满足时才执行。相反,只要任何一个表达式测试为真,OR (-o) 运算符即为真。我们来修改先前的例子,并将其放到一个脚本中来说明这一点:

K}B8P;{\*T H$W051Testing软件测试网X%Y&x'Dh]7C5T_ X

#example9
Y%lGN |0if [ "$LOGNAME" = "emmett" -o "$TERM" = "linux" ]
V|st$D5[ y0then
"T` F Pl(a0echo "Ready to begin."
(Edw;eSBe8g0else51Testing软件测试网cEz.l1G hJq
echo "Incorrect user and terminal."
:M;x(_"T/[`x^0fi51Testing软件测试网WX!RRa`L.W[U

3^| XM`O6ptv/F0$ env51Testing软件测试网&}/Lc@4I
HOME=/
S1niH&M:B ?%x0LOGNAME=emmett
?P1S2w,m.K0MAIL=/usr/mail/emmett
u,@ DVx/L%I0PATH=:/bin:/usr/bin:/usr/lbin51Testing软件测试网 s P6@8VNQX\
TERM=linux51Testing软件测试网 d&y5t6HP
TZ=EST5:0EDT
B3u Zy6s'CSmN0$ example951Testing软件测试网3K&kw\$P7pa+Gu8n
Ready to begin.
yh!jjk3Q1T w!w0$
| P1[xq3D0$ LOGNAME=karen
HJ0M0m9}a;E0u0$ example9
6Un-r!RW [0Ready to begin.
d&p"b([h'm*X)oy0$51Testing软件测试网)W0^3_o6iOuZ7c

CI4{ eWn#I0在脚本第一次运行时,评估判断用户是否等于 emmett。如果发现用户等于 emmett,则脚本转至 echo 语句,并跳过其余的检查。它从不检查终端是否等于 linux,因为它只需要找到一条为真的语句就可以使整个运算为真。在脚本第二次运行时,它判断用户不是 emmett,因此它将检查并发现终端确实是 linux。由于一个条件为真,脚本现在转至 echo 命令。为了引出第二条消息,两个条件都必须为假。51Testing软件测试网 X;T TNya

51Testing软件测试网a-sb1UU

在先前确定时间是否为月末的例子中,可以执行类似的检查来防止用户试图在周末运行脚本:51Testing软件测试网Oz)?Y_-h)s C'C

51Testing软件测试网-u{~i#|ndU

#example10 - Do not let the scrīpt run over the weekend#
$H1L b)X2V[ b0set `date` # use backward quotes51Testing软件测试网.mF:V)c4Zj5uj
if [ "$1" = "Sat" -o "$1" = "Sun" ]51Testing软件测试网'D N B"q"Y)[u
then
6BV }/ro#`|)Un-\0echo "This report cannot be run over the weekend."51Testing软件测试网-Kn8~ fe3|

.Vd7\'^:n!_ J#p0fi51Testing软件测试网ZMf9f&D$f0x


TAG: linux test命令 操作系统

 

评分:0

我来说两句

Open Toolbar