展望2011

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

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

51Testing软件测试网]Wj2R de;^

linuxtest命令(转)51Testing软件测试网Wl-B7]F~

b3b'z9J-?$z y0出处:http://www.oracle.com/technology/global/cn/pub/articles/dulaney_test.html

r%]/P?~W051Testing软件测试网(e[2[(l\t fKR0~|3C

每一种条件语句的基础都是判断什么是真什么是假。是否了解其工作原理将决定您编写的是质量一般的脚本还是您将引以为荣的脚本。

Z \)Sq#u051Testing软件测试网*rm.~^G+d

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

[GNfX i(\m0

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

i UE^4f-T Eb@ E3h"q051Testing软件测试网Ii4]![K].Y

if {condition exists} then ...
Vxy0o]$S0while {condition exists} do ...51Testing软件测试网rYE!s Ni
until {condition exists} do ...51Testing软件测试网vJ GDMQF*mXv&@

51Testing软件测试网-o ex6xH(s P k%^

无论随后的操作是什么,这些基于逻辑的命令都依靠判断一种条件是否真实存在来决定后续的操作。test 命令是使得在每一种情况下都能够确定要判断的条件是否存在的实用工具。因此,彻底了解这个命令对于撰写成功的 shell 脚本至关重要。51Testing软件测试网d(Y0E_"LV)M6w.k

(lP!m)Lhs+C0工作原理

%] _?.ysP051Testing软件测试网F:F Q"sz f-K:N

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

XMi8]n,s)o051Testing软件测试网dq7~N(|!i

test 命令期望在命令行中找到一个参数,当 shell 没有为变量赋值时,则将该变量视为空。这意味着在处理脚本时,一旦脚本寻找的参数不存在,则 test 将报告该错误。51Testing软件测试网6Rk:kG^h7Xl

{;\1n&m0mpu7p:s0当试图保护脚本时,您可以通过将所有参数包含在双引号中来解决这个问题。然后 shell 将变量展开,如果变量没有值,那么将传递一个空值给 test。另一种方法是在脚本内增加一个额外检查过程来判断是否设置了命令行参数。如果没有设置命令行参数,那么脚本会告诉用户缺少参数,然后退出。我们会通过一些例子来更具体地说明所有这些内容。51Testing软件测试网j i VU9dJ4B

51Testing软件测试网/o2h;z8em+W&wzF

test 和 [ 命令

n1?,Tz&n7ij'{051Testing软件测试网s"Wr \;K+U

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

zr.KfB051Testing软件测试网/^3^q^8\Jv-h0b

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

"o/\.t5S|Q3` nY-]0

(V4}q4A_9]AGc0test 和 [ 的语法如下:51Testing软件测试网 H4Rik~ K-iq

,|O3z(Fa*z0test expression51Testing软件测试网)nJD4\$eK|P#d1O
[ expression ]

o7f5qSe8Y051Testing软件测试网~1@sQ+L2_

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

o1BP,|f0因为它们彼此互为别名,所以使用 test 或 [ 均需要一个表达式。表达式一般是文本、数字或文件和目录属性的比较,并且可以包含变量、常量和运算符。运算符可以是字符串运算符、整数运算符、文件运算符或布尔运算符 — 我们将在以下各部分依次介绍每一种运算符。

"GlJ4p#Z{,r&B#U6u051Testing软件测试网?Zn3K#j,[0r

test 文件运算符51Testing软件测试网I3U.[vY ]

51Testing软件测试网.U~5U8q ?6Zl8]3K

利用这些运算符,您可以在程序中根据对文件类型的评估结果执行不同的操作:

yO] yF)d%`t051Testing软件测试网] oi{ th xB r

-b file 如果文件为一个块特殊文件,则为真51Testing软件测试网wP1q%Zt&L})p
-c file 如果文件为一个字符特殊文件,则为真51Testing软件测试网&b%_ZCg:O-u!^
-d file 如果文件为一个目录,则为真
E|c4^ v#N^yk0-e file 如果文件存在,则为真
*?$c2b6[dEG7Upv0-f file 如果文件为一个普通文件,则为真51Testing软件测试网g3j RDe7Pe|(r
-g file 如果设置了文件的 SGID 位,则为真51Testing软件测试网!C`(l \Mm.S|:TC
-G file 如果文件存在且归该组所有,则为真51Testing软件测试网W?/o`)c mN1_t
-k file 如果设置了文件的粘着位,则为真51Testing软件测试网Z9[3d~,R!E#[3K
-O file 如果文件存在并且归该用户所有,则为真51Testing软件测试网 }BE n:md3O
-p file 如果文件为一个命名管道,则为真
(b/UO^T$])yp0l#v0-r file 如果文件可读,则为真
N1O5j/E"A Ei0-s file 如果文件的长度不为零,则为真51Testing软件测试网T#{mx"`!K D:I$E ?/A
-S file 如果文件为一个套接字特殊文件,则为真
h bup(\"j:U0c:v.?+bG0-t fd 如果 fd 是一个与终端相连的打开的文件描述符(fd 默认为 1),则为真
S3^[&`+l D0-u file 如果设置了文件的 SUID 位,则为真
"V'E7xF1_:K)~$u+_0-w file 如果文件可写,则为真51Testing软件测试网(ZJk7Q-Ed&`)U|
-x file 如果文件可执行,则为真51Testing软件测试网 \~{ Z$]5ZO HS

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

Md|&t4}0

6\R`7w4W%O0$ ls -l
V9q(^6WpG e0total 3351Testing软件测试网 kG$ruz
drwxr-xr-w 2 root root 1024 Dec 5 05:05 LST51Testing软件测试网loE_F_5i
-rw-rw-rw- 1 emmett users 27360 Feb 6 07:30 evan51Testing软件测试网0vZs#sU"g!d0Z:G6wr
-rwsrwsrwx 1 root root 152 Feb 6 07:32 hannah
xc X(Dr0drwxr-xr-x 2 emmett users 1024 Feb 6 07:31 karen
2Z({d} MnI X0-rw------- 1 emmett users 152 Feb 6 07:29 kristin
3Op$WOI(|K0-rw-r--r-- 1 emmett users 152 Feb 6 07:29 spencer51Testing软件测试网V'G7Z4a?{
$51Testing软件测试网 k5k/X8vFQ$k

51Testing软件测试网#dw+ZGTQ$Uo~ s

$ test -r evan51Testing软件测试网6dL-f/j E,Z
$ echo $?51Testing软件测试网K|da7v)W,P1j:J]^ l
0

%JR cf8]b J;N&O7r051Testing软件测试网1}~#u(j2n j

$ test -r walter51Testing软件测试网:X/N+zTO
$ echo $?
N`\}d-D01
:?0N:|"m1r,_O+m;{0$

E,h$otSi6i2[051Testing软件测试网T ^~4op {;@

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

51Testing软件测试网Y!Nq0v:Lqn4X_

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

d8B%_h4F2\1Ihku0

h,| @ P0gj#_0$ [ -w evan ]
!Cm9yb&P0$ echo $?
M.D-lG8a!tvT00
]\7z;gB Il;~0$ [ -x evan ]
va uv2MxKz0$ echo $?51Testing软件测试网/xg(l SV?*A
1
Hh X{r ~~+F~0$51Testing软件测试网 |Pn Ys `+l C(A

51Testing软件测试网NT a8V(b:[g

同样,第一个表达式为真,第二个表达式为假 — 正如返回值所指示的那样。您还可以使用以下命令将两个文件彼此进行比较:

a'Y2Bs.e6FW+vk0GN$o0

#j*p1vZ9DA1`P0file1 -ef file2 测试以判断两个文件是否与同一个设备相连,是否拥有相同的 inode 编号51Testing软件测试网?0Jb(w0D3Z nnV
file1 -nt file2 测试以判断第一个文件是否比第二个文件更新(由修改日期决定)
&x)H(kc$D[os0file1 -ot file2 测试以判断第一个文件是否比第二个文件更旧

c&Xqw5})j*sC#{0

0ZVIp4d!f0l%y0以下示例显示了使用这些运算符比较文件的结果:

3^A#[ r;b Za051Testing软件测试网:I1n{2Z1U0[ g

$ [ evan -nt spencer ]51Testing软件测试网W8Occr;O"e
$ echo $?51Testing软件测试网,j5X}T^W4[sR
051Testing软件测试网-_%FKU0Z9N
$ [ karen -ot spencer ]51Testing软件测试网7e4d&^2f)\;Z?7Bfr6o
$ echo $?
{\ g Ewu L"Qv01
(v8kv]1x|A0$

o\7]F'e b1y R0

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

2z5hw9l*Z2Re+b:NK"NY?051Testing软件测试网-?_&R5E1A(V6NB

字符串比较运算符51Testing软件测试网,J{ qn @Z

51Testing软件测试网wC1tG7sG[

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

"v3g7lPh051Testing软件测试网2vdoN r,X

String 测试以判断字符串是否不为空51Testing软件测试网1q8J4capF1|f
-n string 测试以判断字符串是否不为空;字符串必须为 test 所识别51Testing软件测试网;e1A/eb2i0Z
-z string 测试以判断字符串是否为空;字符串必须为 test 所识别
| n e$r gTf7O0string1 = string2 测试以判断 string1 是否与 string2 相同51Testing软件测试网T%o,G&q?.r l
string1 != string2 测试以判断 string1 是否与 string2 不同

SG NWx1ZUL"DT0

+Cz W"MI gs0对任何变量进行的最有用的测试之一是判断它的值是否不为空,可以简单地将其放在 test 命令行中执行这种测试,如下例所示:51Testing软件测试网;_cN E ?h U

51Testing软件测试网 E%xP p(kG

$ test "$variable"51Testing软件测试网;H_6k5bE

51Testing软件测试网!{v5`:KMz]!Gx+U

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

|r6I0@hVv2N0{,k0#example151Testing软件测试网"pos _&B,M i$Q
if test -n "$1"51Testing软件测试网E9V X(k0|5o6g AZ
then51Testing软件测试网*w a g[%u)hM&],S"HI
echo "$1"51Testing软件测试网t/T*oC;w_6u
fi51Testing软件测试网R+k^E/^9BY Q

i:J(WdT!N(l0aMi.G0执行以上例子中的代码将根据 $1 是否存在给出以下结果:51Testing软件测试网cyd]e

51Testing软件测试网;I%C V#g2]!yh

$ example1 friday51Testing软件测试网x jR1?9bC)j
friday
t x$czA:igBGw0$51Testing软件测试网 V)g;q%|)Qg
$ example151Testing软件测试网 t5|0K[,Yr By2`f
$51Testing软件测试网b1ZgM:RH@x}(Q]

51Testing软件测试网7d"~Op`:["g]+_"Y"b

如果将代码更改为以下形式,则结果将相同:

8b3Eu-X\:k zb!Pm.M N$c051Testing软件测试网"cQ?;f]p

#example251Testing软件测试网@N$IRNv_Z L-I#V
if test "$1"
'GH.L)V8QK)M!h gU:M0then51Testing软件测试网ZTK(BE/I&jq
echo "$1"
n a*u8zC0fi51Testing软件测试网 U!Z5Gt;^:Gx

ZC1Y^9m0如下所示:51Testing软件测试网wn^])d3E

0]$G#zHv6V0$ example2 friday51Testing软件测试网V5K;X{xH,oD \
friday
cH%]y)xq0$51Testing软件测试网W.}-kxW yIP0F9fcG
$ example251Testing软件测试网7~P8rH W
$51Testing软件测试网;YP] W&c/ZP~

rEfx&W0所有这些表明,通常不需要 -n,它代表默认操作。51Testing软件测试网2hcmfT.i|Zp

51Testing软件测试网1Q|G-K+f+?gdtL4R8lj

要从一个不同的角度来查看各种可能性,您可以用另一个选项来替换 -n,并检查该值是否为空(相对于非空)。这可以用 -z 选项来实现,代码为:51Testing软件测试网j(ke%~ _/cB

51Testing软件测试网{AkM,i`3Q5b:D?F5q.Nm

#example351Testing软件测试网5R+K]7~0V5v4[j
if test -z "$1"
?#q AKx:wn"p0then51Testing软件测试网HA7~ C]w
echo "no values were specified"
TF}E?kht"} f$`j0fi

;j5sc.q[ \051Testing软件测试网#Z$ah%|3I$at?

运行如下:51Testing软件测试网y`[}*H

51Testing软件测试网+] N)ayG2q3{pN2A

$ example351Testing软件测试网,Ai#@z B'j?&civ
no values were specified51Testing软件测试网QLC.JXph!Y Z
$ example3 friday51Testing软件测试网D*erHR k?
$

iv'Bd$s[i ~(y~:k051Testing软件测试网frIr&BQVv

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

:Xd ]0C2V@2O7x y}|0

Z5}'YW5g Ta0其余的字符串运算符对两个变量/字符串之间的精确匹配或其中的差异(您也可以称之为等价性和“不等价性”)进行评估。第一个例子对匹配进行测试:51Testing软件测试网g9f ?F!c

51Testing软件测试网 Mq;T"aF

$ env51Testing软件测试网j[9s5}7H^m;h
LOGNAME=emmett51Testing软件测试网Em)y0Jb4j
PAGER=less51Testing软件测试网oT_${CpnZ EIX
SHELL=/bin/bash
&I%TyLk |Jj0TERM=linux
` f4fm8C+{0$
'kf HVr0$ [ "$LOGNAME" = "emmett" ]51Testing软件测试网;qd M(XtY9jFx$o$V7hV
$ echo $?51Testing软件测试网$c2o!xf YTX
051Testing软件测试网5bo6m?X4Y!yYKl;j
$
p1vS d9Am0$ [ "$LOGNAME" = "kristin" ]51Testing软件测试网4gk ?*r{!eP1t#b
$ echo $?
tXd1G si01
0M_.u:p_*\Od0$51Testing软件测试网n"V#h-tg i

q Wq fg0或者,该评估可以以脚本的形式用于决定是否运行脚本:51Testing软件测试网'vfM XR

51Testing软件测试网_\LU;D!D#N

#example451Testing软件测试网oP;zD+m
if [ "$LOGNAME" = "emmett" ]
F8~#xy{/Dm!u_0then
'j,k a b Oq jUw9tF&t0echo "processing beginning"
Vd-GO-]"AP+o0else51Testing软件测试网 m|laJu
echo "incorrect user"51Testing软件测试网%X V%t*Yo
fi

g:_a+eo"^ p'G0

.n*m$Y&mX ~4AGi&a0这种方法可以用来寻找任意的值(如终端类型或 shell 类型),在允许脚本运行之前这些值必须匹配。请注意,= 或 != 运算符的优先级高于其它大多数可指定选项,且要求必须伴有表达式。因此,除了比较字符串的选项之外,= 或 != 都不能和检查某种东西(如可读文件、可执行文件或目录)的存在性的选项一起使用。

}'q cx @6_ h+y051Testing软件测试网)vz,@so}HU$|_

整数比较运算符

Q3? Zag6K&A0

(T&u]-A ^9s5R0正如字符串比较运算符验证字符串相等或不同一样,整数比较运算符对数字执行相同的功能。如果变量的值匹配则表达式测试为真,如果不匹配,则为假。整数比较运算符不处理字符串(正如字符串运算符不处理数字一样):

/q U+qPrMm0

#acS!e d:}L vHx't0int1 -eq int2 如果 int1 等于 int2,则为真
Ak9K?t%Y;{ g0int1 -ge int2 如果 int1 大于或等于 int2,则为真
,c/}on)~2Qj0int1 -gt int2 如果 int1 大于 int2,则为真51Testing软件测试网/_*R'|)T!j4u7S9`
int1 -le int2 如果 int1 小于或等于 int2,则为真51Testing软件测试网:v6OSGh5^
int1 -lt int2 如果 int1 小于 int2,则为真51Testing软件测试网6]I%V ]B9j
int1 -ne int2 如果 int1 不等于 int2,则为真51Testing软件测试网cj!S:z~"^&T?8N

51Testing软件测试网 j@5r3E R]nd9A

以下示例显示了一个代码段,其中在命令行中给出的值必须等于 7:51Testing软件测试网\GK1h,_bvB

Zy8SRe5_Kk0#example551Testing软件测试网$H:Do?!i?)l
if [ $1 -eq 7 ]51Testing软件测试网:E/}Ib&ki\C
then
M3qEhF]&H^0echo "You've entered the magic number."
vt @0r&e0else51Testing软件测试网)S?0_%H$J6h
echo "You've entered the wrong number."
@}0]WT1|Qh;b0fi

5?&kF\ W@2P(z0

2]#GT1Z2M k{ O,b(j`0运行中:51Testing软件测试网(zPCRm9{

51Testing软件测试网/z6KN3id1D+I

$ example5 6
.}-Z$bVHDz8p2A6Z0You've entered the wrong number.
}9Fk4wkR9v l Ss*IX0$
_-gjf"_0$ example5 7
T%B a}%W:|bgS0You've entered the magic number.51Testing软件测试网S[c a8@
$

GB#U1|dq3u4cNPgs{0

0M,ggK;T YI)}y0和字符串一样,比较的值可以是在脚本外为变量赋的值,而不必总是在命令行中提供。以下示例演示了实现这一点的一种方法:51Testing软件测试网 ~&N5[LyE

9O$Lc#Sz0#example651Testing软件测试网)E Kog{5h
if [ $1 -gt $number ]
4]3e2D+TCNO0then51Testing软件测试网hi'I.o1c!KG9S
echo "Sorry, but $1 is too high."
m ^_|:CY"q0else
-RFEyl|,d MWs0echo "$1 will work."51Testing软件测试网W3cu'g'{tx,t+W
fi51Testing软件测试网$f7|E1f-uT

0SE4{o6ZE0$ set number=751Testing软件测试网t#Te4^7b
$ export number51Testing软件测试网x&_e&q7z&z&N
$ example6 851Testing软件测试网e4f g lU3[ T
Sorry, but 8 is too high.51Testing软件测试网v*B$WZX%qr{V
$ example6 751Testing软件测试网ko['k {z k
7 will work.
-C3p-z6w Iq Y#Fa'B4yB/K0$

"u&tBf8n;~,P051Testing软件测试网X)r)v{"{;jl4g B/J2z,K

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

5F0I}+Qp(SJD#d051Testing软件测试网R fd1iB)g Z,W

#example7 - display variables, up to three51Testing软件测试网@(p\v9ge yc y`
if [ "$#" -gt 3 ]
)\/{%kT7w7?,|L0then
QJ3HZ2J*X(q%C0echo "You have given too many variables."
vH'N2etbW![a1br6gt0exit $#51Testing软件测试网 n*Q\^c
fi

S"~Pdg \J0

x'X&r?g3N l(E1z#U(d@0只要指定三个或更少的变量,该示例脚本将正常运行(并返回值 0)。如果指定了三个以上的变量,则将显示错误消息,且例程将退出 — 同时返回与命令行中给定的变量数相等的退出代码。51Testing软件测试网hv$L)oS

51Testing软件测试网 n]3Q N+oD2T

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

/_0e?7cWGOZ0#example8 - to see if it is near the end of the month#51Testing软件测试网F@K4TFs
set `date` # use backward quotes
m ?E#Gl0if [ "$3" -ge 21 ]
9DG Y/U }&].^#T;v0then51Testing软件测试网/|2Vg!\e4@ nj
echo "It is close enough to the end of the month to proceed"51Testing软件测试网As,Fz0{sW
else51Testing软件测试网)FR%e:^0Ej;S+n
echo "This report cannot be run until after the 21st of the month"51Testing软件测试网(^^"C1E5p,g cz
exit $3
Bi-X)e3](A!RX0fi51Testing软件测试网 d!^i9@-^|

2c2w9Iw%z!t/SH'|#u4}^"I:l/m0在这个例子中,设置了六个变量(通过空格彼此分开):51Testing软件测试网`d+hMv@+@t4h

.u$I Mg?/k0$1 = Fri
+f-GVF~1n0xS k!I0$2 = Feb
G t.xQ ] hd0$3 = 6
4y.Vp-` K0$4 = 08:56:30
w%p PS&d Z(O D0$5 = EST
%U3oVbLuO!\0$6 = 2004

Uu@H#Jm'cT0

H1A5R.vj{H0这些值可以在脚本中使用,就像它们是在命令行中输入的一样。请注意,退出命令再次返回一个值 — 在这种情况下,返回的值是从 $3 的值中得到的日期。这一技巧在故障诊断时会非常有用 — 如果您认为脚本应该运行而没有运行,那么请查看 $? 的值。51Testing软件测试网e cR;Btj7N

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

$L ` jT*P3Xws k v051Testing软件测试网A GIm9f+j#L @

而另一个想法可能是,只允许脚本在超过 6:00 p.m. (18:00),所有用户都回家之后运行。只要撰写脚本,使其在值低于 18 时退出,并通过使用以下命令来获取时间(将其设为 $1)51Testing软件测试网T6cu-ns

51Testing软件测试网x;v8}uf&z\d

set `date +%H`51Testing软件测试网q Nj}1rw4Z

z$s^Zi0vP0布尔运算符51Testing软件测试网Sq*X5KL

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

NWC2{Z0

v+z:A.G#J+^,m P~0! expr 如果表达式评估为假,则为真
{x*b~5E OFO0expr1 -a expr2 如果 expr1 和 expr2 评估为真,则为真
k V?N'Tf'C0expr1 -o expr2 如果 expr1 或 expr2 评估为真,则为真51Testing软件测试网_uX%lF2a6Lz9t

51Testing软件测试网2S%~1| i`

可以用 != 运算符代替 = 进行字符串评估。这是最简单的布尔运算符之一,对 test 的正常结果取非。51Testing软件测试网;Z$c)d"]U/ia0s

51Testing软件测试网 w-z9A2G)f+R

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

.\Ww,}3\`051Testing软件测试网4Ez `0?o3`/Ak%Z

$ env
f-e-`_.@ i{(n!p0HOME=/
_+J)Y1U#z [!Qk8Q0LOGNAME=emmett51Testing软件测试网*~1N,KWAH o
MAIL=/usr/mail/emmett
d)i(GQ\8V1I[-H8^D0PATH=:/bin:/usr/bin:/usr/lbin51Testing软件测试网T`{geu@$o
TERM=linux51Testing软件测试网P4J"e%K(l
TZ=EST5:0EDT51Testing软件测试网5}0`e~$INQI
$51Testing软件测试网,\H*G"{B?nY1a
$ [ "$LOGNAME" = "emmett" -a "$TERM" = "linux" ]
0DV"qk;zF6}U0}0$ echo $?
rJ_^&g%V'c00
*QSxf(Cz/N$@0$51Testing软件测试网+cz&cD+C"kQB NHx

0J1yv${E8hV*S0$ [ "LOGNAME" = "karen" -a "$TERM" = "linux" ]
@)soNsym0$ echo $?51Testing软件测试网 jJ.ns4@5EP
1
6[.d6|?z M0$

+h3qQ7]D7^,k&od051Testing软件测试网j JIV pj

在第一个评估中,两个条件都测试为真(在一个 linux 终端上登录的是 emmett),因此整个评估为真。在第二个评估中,终端检查正确但用户不正确,因此整个评估为假。51Testing软件测试网;B~S_1k

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

rxnfv~v i0

$zF-AB4z6F0#example951Testing软件测试网)RJ"cD"r3G
if [ "$LOGNAME" = "emmett" -o "$TERM" = "linux" ]51Testing软件测试网HPLQ}'Q
then
eyVF#vm0echo "Ready to begin."51Testing软件测试网*H\\hL O,@
else
&Z&Xfrvt7l0echo "Incorrect user and terminal."
*n:\U(Q,CaY_0fi

4@? a3W'w~K k051Testing软件测试网B!qzT9bM/u

$ env51Testing软件测试网.jX-\\H^$o8s;D
HOME=/
D/b hPa)Oaz2}0LOGNAME=emmett
GK`4[ EL0MAIL=/usr/mail/emmett
HD+c8vFt:B5['_1b0PATH=:/bin:/usr/bin:/usr/lbin
%TB/w0]^(RBH0TERM=linux51Testing软件测试网~^qY k o
TZ=EST5:0EDT51Testing软件测试网`i3^)D1l.G7EO"wq
$ example9
id B#cs:]'}0Ready to begin.
x*fVl^!DA(]{'Z0$
&H7g;aYQy}5Wo e0$ LOGNAME=karen
qq,t(z#w0$ example951Testing软件测试网 R(W*mc*c Z4V.J}#q
Ready to begin.51Testing软件测试网U8v2g6Q;p9S2?^$P
$51Testing软件测试网9Rh3Li}X/s

51Testing软件测试网3f!s'x)f{&x2b'if

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

,ep%~K!dwn9t0

m ` H8b-Hg5tKFz0在先前确定时间是否为月末的例子中,可以执行类似的检查来防止用户试图在周末运行脚本:

Hp:PCch"cv051Testing软件测试网"Hi? ry

#example10 - Do not let the scrīpt run over the weekend#
d&v8Vv/C,TP7~:}0set `date` # use backward quotes
n W+L k$S,GD0if [ "$1" = "Sat" -o "$1" = "Sun" ]51Testing软件测试网7kqQ9p%k'zU-@
then51Testing软件测试网!L-t:x6Dg#[
echo "This report cannot be run over the weekend."

i(FFhTzf*B0

%r+]h:{k:@0fi51Testing软件测试网8HS7|7A"g']$[G6[


TAG: linux test命令 操作系统

 

评分:0

我来说两句

Open Toolbar