Shell脚本测试总结-2

上一篇 / 下一篇  2012-10-15 13:47:24 / 个人分类:杂谈

$q7?1[o6o.F ]0  3)单元测试2:对于单个功能脚本sh -x XXX.sh 跟踪脚本执行情况

Af6["z3R4F/N3W$Ul0

&l_ }-e0q]"S+}0  4)集成测试1:对于所有脚本使用sh -x XXX.sh 跟踪脚本执行情况51Testing软件测试网DohQPKp@x

51Testing软件测试网J.}Aq s v

  5)集成测试2:模拟脚本生产环境,周期性连续多次执行全部功能脚本,监控脚本性能以及日志、临时文件等状态。

$a#hBT(Dke.hG0

j"f]q|Y!agT)E0  6、脚本测试中遇到的问题和解决方案

V*v8XFa#w/w0

tl*e8y ^-PgA0  1)判断一个数组是否为空:51Testing软件测试网p@/q X A/v6Fz

v \NJl"}n S0  【脚本内容】:51Testing软件测试网H'u M m9z9R

$y,FL%V]k}0  if [ -z ${pg_readyDatalist[@]} ]51Testing软件测试网.?'J%c,|*h;h k

S#Zw$mr8C$?7Z0  then

o8G aC*I0

3d^ F6N(M/x5R0  …………51Testing软件测试网9h5X7hf$T

TND y Qj&I0  fi51Testing软件测试网JiX0GC _ ` f$T^

51Testing软件测试网c:uu ~@(t:lL B,^7D

  【问题】:不可如此判断,超过一个元素时,语法错误51Testing软件测试网P'P-Y;l9T

9B.~!G)x.JOG/nA0  【sh -x 执行】:

'v|9EsYnP0

0fr"`Y9P@8z Tg0  + ‘[' -z model gtrindex ']‘51Testing软件测试网 h&Y;? T4U:JX!p8a5i

jA!u P,x!V3Fi/gL0  retrbs_restart.sh: line 366: [: model: binary operator expected

H9O-l&Y+t-f051Testing软件测试网!gtI+Cq

  【原因】:51Testing软件测试网;VG+u r jBE

51Testing软件测试网G`#G4asB#sb

  -z 只能判断一个变量是否为空

-O%dtFb ag_j0

M_4b}.A*aPe/x0  判断一个list是否为空,应该:51Testing软件测试网 P!BdGrl:K*z

51Testing软件测试网'G;|s-Vz_W1\

  【解决】判断list元素个数是否为0

6R8] A6R7xv"H x0

c.O,kJat)`1le0  例如:  if [ ${#ps_retrbs[@]} -eq 0 ]

8_[&R#v&H,fk\GFY051Testing软件测试网i;IM.@|J

  2)If语句判断51Testing软件测试网1aU5e)[0t6JZ

Y sr X!`.r0\0  【脚本内容】:

L5D:V'odl/b2\"eF051Testing软件测试网["st]2si|

  if [ -f ./$i]51Testing软件测试网RL;[y#y

Ef P^{hv kuh!\.?0  then

q;r z#Q/G0H\051Testing软件测试网@I.cEViL"o2L(`

  echo “test

m%K)q2p%}j H051Testing软件测试网Sa.wKS^mh

  fi

s'Yzy*U{CC.N0

| a W G1x:ipi*U0  【问题】: .$i] 的“]”前面没有空格,造成语法错误51Testing软件测试网 E+y9W5r"g}

51Testing软件测试网T k u R r7a

  【sh -x 执行】:./test.sh: line 3: [: missing `]

A3vz1Z;Q s0

|u%c(p#[BZ0  【原因】: If语句的条件判断“[ ]”,“[”之后和“]”之前必须有空格

B!k"^eh.t0

*imz3eqsNG zn0  【解决】加上空格51Testing软件测试网"M@,x ybD+s2}

E5qG| X'JF0  3)字符串判断

};C{ J6\uo A051Testing软件测试网:KF\7I6X&? {'k

  【脚本内容】:

0I'G S%Pk*s051Testing软件测试网9t+id8tt3[,Q0C'r

  if [ "$1" = "continue" ]  then

g@'r1L.i%pz1}051Testing软件测试网"q;G@Xmq%m

  echo  “succ”

'T.Q*R+~{z:a9U0

k*T\ d/?0  fi

/Y7nH7F(z(Kv3ui0

/b'Sy3vZ8n0  【问题】:$1为空,打印“succ”

S7t?y*[e0

xm&X:yf9I.[,L0  【sh -x 执行】:succ

8Y+xw-uM*ilXR051Testing软件测试网.F0D|iZ6pFk

  【原因】: $1为空会造成语法错误,返回0,继续执行if代码块中的逻辑,导致判断错误

9~`}7kN7wQ0

3@#Y l4X4^Yuhn0  【解决】修改成 if [ "a$1" = "acontinue" ]

Y|'t i%U-fc0

P4n4D {Q0  4)变量传播

-`-WJ&J3q4A051Testing软件测试网.ytMN Fv8P

  【脚本内容】:

8TQc7Wv1lNtm0

)l~'o mkTM&`0  func(){

^U;@Q@cxw E051Testing软件测试网(E#ioP2}-y M

  for((i=0;i<$RETRY_TIMES;i++))

6^@-?du5Wgi0U5H051Testing软件测试网2WCa,Y)j

  do

v5Vr4NM;e,eT9R051Testing软件测试网;~E1vZ%D8~^1I

  NOTICE “delBlacklist”51Testing软件测试网T _4p!F8o!Z)[9v,}6yd4t

0hN9@?:T Lc0  done

5mQa3vxt{*`0

"mMGq"A gl(oA0  }

#X/V%kDU\0

j v|,xYe0  for (( i=0; i<pggroup_size; i++))51Testing软件测试网f+Qq(b c*}kh

51Testing软件测试网6`;f Af/Co$x5^

  do

&c P?:J(OLm0

x g`4r V#Ai0  func()51Testing软件测试网3N a8L*M(P)g4S

+WaNJm"\E0  done51Testing软件测试网2F+J k,q.sF

(ug Bw.h1tJ0  【问题】:“i”的值自增之后会传递到外层调用脚本,导致外层调用脚本的循环跳过或死循环

0@o-u:q4GmS2Ok0

rl#U!a,\8xr9T.@0  【解决】避免使用i,j,k等常见的循环控制变量,使用自定义的变量名,如retry_count等51Testing软件测试网.y8cz.E!]

51Testing软件测试网*}8^5@)~+c4|+w"o

  在shell函数中定义的变量加上local关键字51Testing软件测试网&E#[ h%v-D? \~0z

"QDLxf1g3y0  5)命令连接

7uw/O3l]L0b K.I]051Testing软件测试网9IMw? p G(t

  问题一:

R`9C EFr }051Testing软件测试网 zI` ?$M-] fw$F

  【脚本内容】:

1R&jC6]7C&kl ef-N051Testing软件测试网*cY4mX3ux'b,G j

  cd to_del; rm -rf *

)SnpPYb(l0

*D9t#dW7G0  【问题】:如果cd 目录失败,rm -rf * 会错误地删除当前目录下的所有文件

:zGW9q'[#z0

%|VW,a6J,A0  【解决】使用 && 连接   cd失败将不会继续执行后面的命令51Testing软件测试网#~%Xj;R oB

51Testing软件测试网ypG*Ux&{

  问题二:51Testing软件测试网&W\j^uCv["U

51Testing软件测试网5R(a)W4e,j%NO p

  【脚本内容】:51Testing软件测试网 o9q:gj(? u

51Testing软件测试网;L;eT S1V\W6?p1y

  for data in ${datalist{@}}

7I5g`&]S(m9\ oH051Testing软件测试网W%A3K-H%Cd:y3b.r

  do

S!e$W-~q+C I*D|051Testing软件测试网G+d4c6wZ(s-H

  runRemoteCmd ${host} “cd ${data_path}.new && [[ -f ${data_flag} ]]” || suc=0 && break

'X7d!W*mcSk N:Y0

"y.Il L%A*l0  done

O j5].c1wU051Testing软件测试网|4FF4Yh

  【问题】:这里的 || && 是同一个优先级51Testing软件测试网8{ y;W6{Ba;v

M(V`~Jj+{0  那么就是说 && 后面的语句 break无论什么情况下都不可能被执行到51Testing软件测试网p3VD_;C I$u

Q3glH(HqCxv0  【解决】拆成两条语句,单独判断suc51Testing软件测试网8l"D.r&B\9u ^e"diC c,w

F0{R(gk;k\k$u0  6)文件泄露

W9u#W vP+N0

)vJ"QXp!tm:b0  【脚本内容】:

|p\3I5T%B051Testing软件测试网O\!Y2R6S)r

  local status=$( mySsh ${remote_host} “{ ${command%%;}; }&>/tmp/$$ && echo 0 || echo 1″ )

@-] S3nZ0`~0v5d0

f'P |6fa'h F"p0  【问题】:上述代码将远程执行命令行的输出结果导入到一个以pid命名的临时文件中,在脚本关闭的时候没有清除,每一次执行将创建一个新文件,很可能导致文件泄露问题。

Gn$Y l7K4I051Testing软件测试网H*I|{7P*v+S$I JX

  【解决】注意清理脚本生成的临时文件

u?K&tUY051Testing软件测试网#DT.k&tP

  7)ssh 远程执行后台命令不靠谱

*k2o6`9Nr/\/]/s$a5A0

/ZL*AG Sk*yl5S$W0  【脚本内容】:

]'a3Z9j?Dg'_2T/u-T051Testing软件测试网][&`r C(qC `/}ZF:w

  ssh hostname “cat bin &“

+n6^{R'Y$H~K8z'i"Xt051Testing软件测试网_Nh$d#U

  【执行】

4s$g'_6W j5I[3P051Testing软件测试网{At:xuq3P

  [work@www.baidu.com bin]$ ssh localhost “cat bin &”

4M~l6q!u!Kb3X6[&w@J0

8u&BJ2VAZYP0B0  cat: bin: Is a directory51Testing软件测试网B&did?-w8q

g awN)L|so0  [work@www.baidu.com bin]$ echo $?

| UF@/Y` ?0

:J }}E9Hc0  0

vSz*Q$S E#F$M#s)Cj0

!ha&H ^"YV#G,n0R0  【问题】:命令执行错误,返回值为0

ZD#r,G fN2UW:B8T1a0

~(?*B&IHK\0  【解决】将远程命令放在前台执行:51Testing软件测试网hM{[-R/X b,K._5q

1kJ5? p/xCxbX0  [work@www.baidu.com bin]$ ssh localhost “cat bin”51Testing软件测试网G B'v \N[2Y

%\;G@#Ds&u0  cat: bin: Is a directory51Testing软件测试网P0`Xe*YmU)[

51Testing软件测试网#ml's)~GQ(@Z n

  [work@www.baidu.com bin]$ echo $?51Testing软件测试网n6]qU5WR"d

t | q$g&\@;^7U)K[0  1

A J:{dI H0

7G.e0H t gD6j0  8)变量使用前使用unset清理

vV/Mo"o1lI0

M p.x4~$^-k5N%n'zs0  【脚本内容】:一般是针对脚本的配置文件

M^x[em051Testing软件测试网 QPL4w Q3H1kqlw

  ps_retras[0]=”work@www.baidu.com”51Testing软件测试网!lU&[R-R~FX

O9p9{#W4Xf }!K0  ps_retras[1]=”work@www.baidu.com”51Testing软件测试网&i"w|Bi

51Testing软件测试网M!f(uy V1e7I

  【问题】:如果OP修改ps_retras数组的配置,可能无法生效

?/yuh-VJ)M8b051Testing软件测试网w4N3XD%jz

  【解决】使用unset进行清理

D;n8f;z9fr8n0

kK}1E x5b0  unset

:sVT| S1D051Testing软件测试网%a|"G*L;Tv

  功能说明:删除变量或函数。51Testing软件测试网8E2O BV}![ j"h

51Testing软件测试网!@:X*Wy$iL

  语法:unset [-fv][变量或函数名称]

R;[;?8xau051Testing软件测试网giOf/iVEw.X

  参数:51Testing软件测试网'} W"S*GQX6i*{

51Testing软件测试网5h1v l$j7C4]9F

  -f 仅删除函数。51Testing软件测试网y,p$CO c` n

51Testing软件测试网lGL$fT8C

  -v 仅删除变量。

c6Ec~s)tUW051Testing软件测试网1O(BS"lB,rn2K#V7V

  例如:unset ps_retras

rz+z)k9I0

5{@+KQ;zBj/X}8t0  ps_retras[0]=”work@www.baidu.com”51Testing软件测试网G8O;H C3t6m$G

51Testing软件测试网:Ob3y VwT)x*GL

  ps_retras[1]=“work@www.baidu.com“51Testing软件测试网)W5p d6aor

mt Y+?m f-~0  7、shell 内置变量51Testing软件测试网` dUmdCv,sf

[$t^GD0  1)$FUNCNAME

6Js8GMs/U0

co uOo(J0  函数的名字,类似于C语言中的内置宏__func__,但宏__func__ 只能代表当前所在的函数名,而$FUNCNAME的功能更强大,它是一个数组变量,其中包含了整个调用链上所有的函数的名字,故变量${FUNCNAME [0]}代表shell脚本当前正在执行的函数的名字,而变量${FUNCNAME[1]}则代表调用函数${FUNCNAME[0]}的函数的名字,依 此类推。

(R3y dWc5U;p+z051Testing软件测试网;k)Vq])Bk:sJmVm

  2)$BASH_SOURCE

n/`4Jl#Ezp0k0

$[x#m%O'U0  shell脚本源文件名,与FUNCNAME相对应51Testing软件测试网'X0OpoB$g_mg(}(~

51Testing软件测试网m2K XAO

  3)$BASH_LINENO

HhbZ6gD.E7mA0

iXjX,Vd2J0  代表shell脚本的当前行号,类似于C语言中的内置宏__LINE__,与FUNCNAME相关联

"pBbSz|"p[H051Testing软件测试网#|)j6| e [X

  BASH_LINENO[$i] 指示的是 FUNCNAME[$i + 1]被调用的位置

b_9R |s0

!q{*m'rF"tJ0  4)$PS451Testing软件测试网7vL7ewx%z8Y

51Testing软件测试网~N9T ve.KJL[7M

  第四级提示符变量$PS4 , $PS4的值将被显示在“-x”选项输出的每一条命令的前面。在Bash Shell中,缺省的$PS4的值是”+”号。(现在知道为什么使用”-x”选项时,输出的命令前面有一个”+”号了吧 )

t+x$RB C051Testing软件测试网#P$x4\!Vm*j7uc,J

  通过修改$PS4的值,就可以达到sh –x 时显示行号还有函数名称的目的了。

}[_j r%\/C|0

TAG:

 

评分:0

我来说两句

Open Toolbar