Shell脚本测试总结-2

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

51Testing软件测试网!L#MNsnCfkY

  3)单元测试2:对于单个功能脚本sh -x XXX.sh 跟踪脚本执行情况51Testing软件测试网MHK+V~q

51Testing软件测试网(W@#l }[GB7P;}

  4)集成测试1:对于所有脚本使用sh -x XXX.sh 跟踪脚本执行情况

U?f'B2]&~2Alr A051Testing软件测试网 x]?]lI y

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

zk L? D K%|6R K051Testing软件测试网n {YU }c

  6、脚本测试中遇到的问题和解决方案51Testing软件测试网r!xF7HH

Pu#U2DKw3t0v R5B)D6W0  1)判断一个数组是否为空:

&xw]8OT j!C051Testing软件测试网3X+l }8S)a \j-A

  【脚本内容】:51Testing软件测试网9n@O7M AZM,O

q5p k+B$`H0  if [ -z ${pg_readyDatalist[@]} ]51Testing软件测试网u A8n?V&p/d5e |Cq3P

H0B@%@*{9w0  then

(Mjb)I!E6g*g/G&d051Testing软件测试网^R t-\/G

  …………51Testing软件测试网7S\,iH#N~[{5e

*\/V#S"K:ej#q^!q0  fi

S ?`4| x^051Testing软件测试网L zf1a#UL

  【问题】:不可如此判断,超过一个元素时,语法错误

._;C/KfF$c\0

.Z8T6I0DRs~T0  【sh -x 执行】:51Testing软件测试网N6y@3N%fS{z~_

ZK;f7u4ScX3[f0  + ‘[' -z model gtrindex ']‘51Testing软件测试网,g6K a1Uyse

51Testing软件测试网g K(^6q1s*pb8jr u

  retrbs_restart.sh: line 366: [: model: binary operator expected

*`1_h Av]c Z-vN{]051Testing软件测试网%@}4`SCzY!w YSQ

  【原因】:

E2nvTV7o0

(e-~ A#[z\ l0  -z 只能判断一个变量是否为空51Testing软件测试网*?(J(q:z8|5R,c)JAb

"@|qB.[X ia0  判断一个list是否为空,应该:51Testing软件测试网1?ZH a3x ?_$t1B-w

7f7R!q7@^1n0  【解决】判断list元素个数是否为051Testing软件测试网L+yj.JZ`"]s

51Testing软件测试网$^a)D!^3u9D/o,q

  例如:  if [ ${#ps_retrbs[@]} -eq 0 ]51Testing软件测试网XC!m3?dw+\kQ_

51Testing软件测试网8CToM%[~#B/~

  2)If语句判断

!e q^w L-E0

e ~Ly4V4MJ9[0  【脚本内容】:51Testing软件测试网8M+h\+eS;K&Y A#T+l Ic

51Testing软件测试网U6^?r*z4Zl

  if [ -f ./$i]51Testing软件测试网?2]8a*J*Sd

N'b0d\^O0  then51Testing软件测试网"w(a9e4c1l9\E8?

51Testing软件测试网 l,y!k;~9| ]*w1TKO

  echo “test51Testing软件测试网!g(p(pI*wQ/If

51Testing软件测试网ve N8J$f \'`

  fi

+PlG0TV3~0

4~5IC0L dUZ4e w0  【问题】: .$i] 的“]”前面没有空格,造成语法错误

2_*fT(^ i oA G i051Testing软件测试网,NR `Hj*p-Gz

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

'wa"R^6a1YJ)n%b4x0

}x h%Y9R9i tG-L)|0  【原因】: If语句的条件判断“[ ]”,“[”之后和“]”之前必须有空格

kiT|i0S!ca.o fI$o5b051Testing软件测试网xL8~s\4C)JT^#d!{

  【解决】加上空格

*io#l'sD_051Testing软件测试网o3}lbWAQ2|L

  3)字符串判断51Testing软件测试网z0^xI PS

h5u H+H$a/N0  【脚本内容】:51Testing软件测试网x Oh5?FV

51Testing软件测试网"V5dXF `B&n'g9r

  if [ "$1" = "continue" ]  then51Testing软件测试网!D0E`%_ A)n_ uZ

Cx7c J4W5ut?0  echo  “succ”51Testing软件测试网R1cwN)tp&S2w VPY7X*R

S q P7r$s a]0  fi51Testing软件测试网qN/J%Z9m

j S s?2D4z0  【问题】:$1为空,打印“succ”51Testing软件测试网/y)O7G ]"TrT$J,U

51Testing软件测试网{To^$} b Ogg

  【sh -x 执行】:succ

` QL lq0

laRW&p |b5w0  【原因】: $1为空会造成语法错误,返回0,继续执行if代码块中的逻辑,导致判断错误51Testing软件测试网'DO u1q kI0V

*NAoTE*IB8[T R:J0  【解决】修改成 if [ "a$1" = "acontinue" ]51Testing软件测试网l"qs2`HZ0x

51Testing软件测试网,@ j~ BEr:N,A{jC

  4)变量传播

2a#C(Bd:m ?{0

)_aY"~ Y+_0  【脚本内容】:51Testing软件测试网)Vp n.G S

51Testing软件测试网(n4bGs#\Mt

  func(){

6fb#W]0E`h0

0n&R*v Hgs0  for((i=0;i<$RETRY_TIMES;i++))51Testing软件测试网k-u*u*D1E AP

51Testing软件测试网x3V;v~bL

  do

H:s o$Y`i9us'I#A0

k-s+[b+[D f@rq0  NOTICE “delBlacklist”

d)ihDY#A [:v#r iW051Testing软件测试网jk3H~8U!S/n'_ h[

  done51Testing软件测试网Rs|qSq fR

V.c0ue9{C0  }51Testing软件测试网,}|(PQB;_(v6H/|

C.L"j9skw"rd-ml\0  for (( i=0; i<pggroup_size; i++))

8w m s1RB*p^|r051Testing软件测试网*G2s+N"D"n

  do51Testing软件测试网1a3F o8df4U

51Testing软件测试网oQ1i0t/{"lN&A

  func()51Testing软件测试网 BP)YVO3\i

H jT5p Sd0  done

h2oPs#?N8kf#Nij0

3V [s |v*W0  【问题】:“i”的值自增之后会传递到外层调用脚本,导致外层调用脚本的循环跳过或死循环51Testing软件测试网;t7O.yu j"v

51Testing软件测试网H_Of,E

  【解决】避免使用i,j,k等常见的循环控制变量,使用自定义的变量名,如retry_count等51Testing软件测试网)x,G,g/sY

51Testing软件测试网$rW(WO7T.~w-YSG-nd

  在shell函数中定义的变量加上local关键字51Testing软件测试网6^ KAPn {$P"P7S BQ

51Testing软件测试网x"L"t0I{

  5)命令连接

/E$T$?AQ2f8H7s051Testing软件测试网1O4mWr nJpLkw

  问题一:51Testing软件测试网Bmnjfn7h

51Testing软件测试网m0T/T2R0M.Hv4}]D1h

  【脚本内容】:

%R-N4g5Fy u0

T`}9hhu8R0  cd to_del; rm -rf *51Testing软件测试网DB W#QVR6HF pO

51Testing软件测试网U)T+m9YH2^-g0k

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

!B p_T^[ Z051Testing软件测试网t0b0JnF/X)TXd

  【解决】使用 && 连接   cd失败将不会继续执行后面的命令

IS y Hj*^0

0e*ZSZL JbTRJ0  问题二:

9@R9y TS9GCnXB051Testing软件测试网F-D |%i"d1^V$X}2ld

  【脚本内容】:

JR$dY xe051Testing软件测试网v,hL*B!@[

  for data in ${datalist{@}}

(y5{Bim)H~C051Testing软件测试网 h y4a1_F

  do51Testing软件测试网V_)`XX

51Testing软件测试网{bb%n!s

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

!A&j;n Q@*[,h2k g051Testing软件测试网 H&v%E"yG&NI?

  done51Testing软件测试网L&P&We} \(O

51Testing软件测试网j4z.[VK8Q-tM.d

  【问题】:这里的 || && 是同一个优先级51Testing软件测试网YG3\1x0k#Y](\

VZY1SLh0  那么就是说 && 后面的语句 break无论什么情况下都不可能被执行到51Testing软件测试网{+Xg)h(ZH+a^

51Testing软件测试网&ou|7KT$Z^Ly

  【解决】拆成两条语句,单独判断suc51Testing软件测试网 D9~ v$L_ JcD

51Testing软件测试网Ig[ }#R)~&{9c

  6)文件泄露

s]D[~ m(F051Testing软件测试网S` l}f bc w

  【脚本内容】:51Testing软件测试网/eL:OE a

51Testing软件测试网NT_FCu

  local status=$( mySsh ${remote_host} “{ ${command%%;}; }&>/tmp/$$ && echo 0 || echo 1″ )51Testing软件测试网,XTJ)p.~@c

!r([G0Y&ft ^0  【问题】:上述代码将远程执行命令行的输出结果导入到一个以pid命名的临时文件中,在脚本关闭的时候没有清除,每一次执行将创建一个新文件,很可能导致文件泄露问题。

`J.r:bCR!jS051Testing软件测试网a+MBR3T"@

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

;S}@C*W;ug1kgJ]0

;B3Q8dG1M2|0  7)ssh 远程执行后台命令不靠谱

%@ED W_!T"h%l(h`051Testing软件测试网'X%F3Z M$\}&U,Z Sr

  【脚本内容】:

vc j7_A+K051Testing软件测试网QKe gN)R

  ssh hostname “cat bin &“

x_!zzh0

O/_2` F(l-[0  【执行】

J+wLwz&C%~r*h051Testing软件测试网;w,{8JWu"^2Y1b(^

  [work@www.baidu.com bin]$ ssh localhost “cat bin &”51Testing软件测试网*\*jb7x r

51Testing软件测试网y[seya&n+h:C4e

  cat: bin: Is a directory51Testing软件测试网Vwo%O5t;Yy

R(n6H-S0} `0  [work@www.baidu.com bin]$ echo $?

f2Ly'a,T`A:N$Km0

~n ^ cX$d0  0

2e%NU e u7\$XA#VP:_051Testing软件测试网y0m0O3J,k

  【问题】:命令执行错误,返回值为0

(J[7d7r3^[1H051Testing软件测试网P'\eM;w_1F

  【解决】将远程命令放在前台执行:

V0O {!TD9a-E0

:pjk:LF{0  [work@www.baidu.com bin]$ ssh localhost “cat bin”

4D9lHgp5p-`.D0

?X|/]7Z ^ F0  cat: bin: Is a directory

ecN;^Tm |%\0

'ls#MD/v0  [work@www.baidu.com bin]$ echo $?

*eX5w;^%?"f4d051Testing软件测试网'?Pp[+lZo

  151Testing软件测试网;E+Jvc&z*d${*I

51Testing软件测试网+nL5kj H!\o

  8)变量使用前使用unset清理51Testing软件测试网-Z4a @ `H'x

pP`l-V!m^kJeD `:K0  【脚本内容】:一般是针对脚本的配置文件51Testing软件测试网 p!J2~5g$O/pHrz

51Testing软件测试网)_-^)H#m#vH:lw6W

  ps_retras[0]=”work@www.baidu.com”51Testing软件测试网)F'R~Y]2J`M

!n&w6Qg&|Z R@/t#q0  ps_retras[1]=”work@www.baidu.com”51Testing软件测试网6[$L?1v'H}]]

51Testing软件测试网:Q&I x7F%X9M5nUw

  【问题】:如果OP修改ps_retras数组的配置,可能无法生效51Testing软件测试网.@/D,c"h-G"R

0ek8WWZ|#sg'n-x0h0  【解决】使用unset进行清理51Testing软件测试网 ul ^EJ%r

1C5A;PrgO)z'd;L0  unset

5E.d8^;p*POeO0

Zjj4nBL5Y0  功能说明:删除变量或函数。51Testing软件测试网S0h:X{c6k.`Oy

51Testing软件测试网5B}6i%K2T$\

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

/H|;vY2n6hY0

S'jxY;FU0~0  参数:

.k7td$^6jG1|6[&u051Testing软件测试网U*a3Z:qan @t:qH

  -f 仅删除函数。

*CF3pd&RH(q ?0

v1s&C:g2v-dS}*A0  -v 仅删除变量。

@8z^M.}z-P0

X-I@4eQf V F0  例如:unset ps_retras51Testing软件测试网c~m5j/P8HK6_.J Ak B

51Testing软件测试网 o/Rvq$tz~W

  ps_retras[0]=”work@www.baidu.com”

og8b&j1[7E0

4_$[ X;\[9|0  ps_retras[1]=“work@www.baidu.com“51Testing软件测试网)\ [3p(jzQL

U'QlQV P A&S0  7、shell 内置变量

B kIu;@8H'L)a051Testing软件测试网L:ytcD H N)Z

  1)$FUNCNAME51Testing软件测试网@1W*Z(T;b[Y3`

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

1Bj)r%n@^b#k1D0

H1P1eH)z)VIw#lV0  2)$BASH_SOURCE51Testing软件测试网}1K-U(r;f;rf/V

51Testing软件测试网xV(\OWL3|

  shell脚本源文件名,与FUNCNAME相对应51Testing软件测试网p-Y$m%b&~AB:Iyy

51Testing软件测试网,K9Y:t Ya1n"E VQ

  3)$BASH_LINENO

5J|,G~QK-U-WXT051Testing软件测试网1Pc c B|

  代表shell脚本的当前行号,类似于C语言中的内置宏__LINE__,与FUNCNAME相关联51Testing软件测试网:GV g ]^w W%J$c

51Testing软件测试网 sTN"tY t fq

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

p](n$E[eF!i u$i0

ar i9hG7I%nI0  4)$PS4

6L%]"X \FUU.^l0

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

:~W&X*s#Z].~051Testing软件测试网|T+Jy1be

  通过修改$PS4的值,就可以达到sh –x 时显示行号还有函数名称的目的了。51Testing软件测试网7[bm`(BA#] F


TAG:

 

评分:0

我来说两句

Open Toolbar