Shell脚本测试总结-2
上一篇 / 下一篇 2012-10-15 13:47:24 / 个人分类:杂谈
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]?]lIy5)集成测试2:模拟脚本生产环境,周期性连续多次执行全部功能脚本,监控脚本性能以及日志、临时文件等状态。
zkL? D K%|6R K051Testing软件测试网n {YU }c6、脚本测试中遇到的问题和解决方案51Testing软件测试网r!xF7HH
Pu#U2DKw3t0vR5B)D6W0 1)判断一个数组是否为空:
&xw]8OTj!C051Testing软件测试网3X+l }8S)a\j-A【脚本内容】:51Testing软件测试网9n@O7M AZM,O
q5p k+B$`H0 if [ -z ${pg_readyDatalist[@]} ]51Testing软件测试网uA8n?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软件测试网gK(^6q1s*pb8jruretrbs_restart.sh: line 366: [: model: binary operator expected
*`1_h Av]c Z-vN{]051Testing软件测试网%@}4`SCzY!wYSQ【原因】:
E2n vTV7o0(e-~ A#[z\ l0 -z 只能判断一个变量是否为空51Testing软件测试网*?(J(q:z8|5R,c)JAb
"@|qB.[X ia0 判断一个list是否为空,应该:51Testing软件测试网1? ZHa3x?_$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?d w+\kQ_
51Testing软件测试网8CToM%[~#B/~2)If语句判断
!eq^w L-E0e ~Ly4V4MJ9[0 【脚本内容】:51Testing软件测试网8M+h\+eS;K&Y A#T+l Ic
51Testing软件测试网U6^?r*z4Zlif [ -f ./$i]51Testing软件测试网?2]8a*J*Sd
N'b0d\^O0 then51Testing软件测试网"w(a9e4c1l9\E8?
51Testing软件测试网l,y!k;~9| ]*w1TKOecho “test”51Testing软件测试网!g(p(pI*wQ/If
51Testing软件测试网ve N8J$f \'`fi
+PlG0TV3~04~5IC0L dU Z4e w0 【问题】: .$i] 的“]”前面没有空格,造成语法错误
2_*fT(^ ioA 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软件测试网x L8~s\4C)JT^#d!{【解决】加上空格
*io#l'sD_051Testing软件测试网o3}lbWAQ2|L3)字符串判断51Testing软件测试网z0^xI PS
h5uH+H$a/N0 【脚本内容】:51Testing软件测试网x Oh5?FV
51Testing软件测试网"V5d XF `B&n'g9rif [ "$1" = "continue" ] then51Testing软件测试网!D0E`%_A)n _ uZ
Cx7c J4W5ut?0 echo “succ”51Testing软件测试网R1cwN)tp&S2w VPY7X*R
S qP7r$s a]0 fi51Testing软件测试网qN/J%Z9m
j Ss?2D4z0 【问题】:$1为空,打印“succ”51Testing软件测试网/y)O7G ]"TrT$J,U
51Testing软件测试网{To^$} b Ogg【sh -x 执行】:succ
`QL lq0laRW&p|b5w0 【原因】: $1为空会造成语法错误,返回0,继续执行if代码块中的逻辑,导致判断错误51Testing软件测试网'DO u1q kI0V
*NAoTE*IB8[TR:J0 【解决】修改成 if [ "a$1" = "acontinue" ]51Testing软件测试网l"qs2`HZ0x
51Testing软件测试网,@ j~BEr:N,A{jC4)变量传播
2a#C(Bd:m ?{0)_aY"~Y+_0 【脚本内容】:51Testing软件测试网)Vpn.GS
51Testing软件测试网(n4bG s#\Mtfunc(){
6fb#W ]0E`h00n&R*vHgs0 for((i=0;i<$RETRY_TIMES;i++))51Testing软件测试网k-u*u*D1E AP
51Testing软件测试网x3V;v~bLdo
H:s o$Y`i9us'I#A0k-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"r d-m l\0 for (( i=0; i<pggroup_size; i++))
8w m s1RB*p^|r051Testing软件测试网*G2s+N"D"ndo51Testing软件测试网1a3Fo8df4U
51Testing软件测试网oQ1i0t/{"lN&Afunc()51Testing软件测试网BP)YVO3\i
H jT5p Sd0 done
h2oPs#?N8kf#N ij03V [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"P7SBQ
51Testing软件测试网x"L"t0I {5)命令连接
/E$T$?AQ2f8H7s051Testing软件测试网1O4m W r nJpLkw问题一:51Testing软件测试网Bmnjfn7h
51Testing软件测试网m0T/T2R0M.Hv4}] D1h【脚本内容】:
%R-N4g5Fy u0T`}9hhu8R0 cd to_del; rm -rf *51Testing软件测试网DBW#QVR6HFpO
51Testing软件测试网U)T+m9YH2^-g0k【问题】:如果cd 目录失败,rm -rf * 会错误地删除当前目录下的所有文件
!B p_T^[ Z051Testing软件测试网t0b0JnF/X)TXd【解决】使用 && 连接 cd失败将不会继续执行后面的命令
IS yHj*^00e*ZSZLJbTRJ0 问题二:
9@R9yTS9G CnXB051Testing软件测试网F-D |%i"d1^V$X}2ld【脚本内容】:
JR$dY xe051Testing软件测试网v,hL*B!@[for data in ${datalist{@}}
(y5{Bim)H~C051Testing软件测试网hy4a1_Fdo51Testing软件测试网V_)`XX
51Testing软件测试网{bb%n!srunRemoteCmd ${host} “cd ${data_path}.new && [[ -f ${data_flag} ]]” || suc=0 && break
!A&j;nQ@*[,h2kg051Testing软件测试网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)~&{9c6)文件泄露
s ]D[~ m(F051Testing软件测试网S` l}f bc w【脚本内容】:51Testing软件测试网/eL:OEa
51Testing软件测试网NT_FCulocal status=$( mySsh ${remote_host} “{ ${command%%;}; }&>/tmp/$$ && echo 0 || echo 1″ )51Testing软件测试网,X TJ)p.~@c
!r([ G0Y&ft ^0 【问题】:上述代码将远程执行命令行的输出结果导入到一个以pid命名的临时文件中,在脚本关闭的时候没有清除,每一次执行将创建一个新文件,很可能导致文件泄露问题。
`J.r:bC R!j S051Testing软件测试网a+MBR3T"@【解决】注意清理脚本生成的临时文件
;S}@C*W;ug1k gJ]0;B3Q8dG1M2|0 7)ssh 远程执行后台命令不靠谱
%@ED W_!T"h%l(h`051Testing软件测试网'X%F3Z M$\}&U,Z Sr【脚本内容】:
vc j7_A+K051Testing软件测试网QKegN)Rssh hostname “cat bin &“
x_!zzh0O/_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:C4ecat: 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 eu7\$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[+lZo151Testing软件测试网;E+Jvc&z*d${*I
51Testing软件测试网+nL5kj H!\o8)变量使用前使用unset清理51Testing软件测试网-Z4a@`H'x
pP`l-V!m^kJeD`:K0 【脚本内容】:一般是针对脚本的配置文件51Testing软件测试网 p!J2~5g$O/pH rz
51Testing软件测试网)_-^)H#m#vH:lw6Wps_retras[0]=”work@www.baidu.com”51Testing软件测试网)F'R~Y]2J`M
!n&w6Qg&|ZR@/t#q0 ps_retras[1]=”work@www.baidu.com”51Testing软件测试网6[$L?1v'H}]]
51Testing软件测试网:Q&Ix7F%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*POeO0Zjj4nBL5Y0 功能说明:删除变量或函数。51Testing软件测试网S0h:X{c6k.`Oy
51Testing软件测试网5B}6i%K2T$\语法:unset [-fv][变量或函数名称]
/H|;vY2n6hY0S'jx Y;FU0~0 参数:
.k7td$^6jG1|6[&u051Testing软件测试网U*a3Z:qa n @t:qH-f 仅删除函数。
*CF3pd&RH(q?0v1s&C:g2v-dS}*A0 -v 仅删除变量。
@8z^M.}z-P0X-I@4eQf V F0 例如:unset ps_retras51Testing软件测试网c~m5j/P8HK6_.J Ak B
51Testing软件测试网 o/Rvq$tz~Wps_retras[0]=”work@www.baidu.com”
og8b&j1[7E04_$[ 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 HN)Z1)$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#k1D0H1P1eH)z)VIw#lV0 2)$BASH_SOURCE51Testing软件测试网}1K-U(r;f;rf/V
51Testing软件测试网xV(\OWL3|shell脚本源文件名,与FUNCNAME相对应51Testing软件测试网p-Y$m%b&~AB:I yy
51Testing软件测试网,K9Y:tYa1n"EVQ3)$BASH_LINENO
5J|,G~QK-U-WXT051Testing软件测试网1Pc c B|代表shell脚本的当前行号,类似于C语言中的内置宏__LINE__,与FUNCNAME相关联51Testing软件测试网:GVg ]^wW%J$c
51Testing软件测试网 sTN"tY tfqBASH_LINENO[$i] 指示的是 FUNCNAME[$i + 1]被调用的位置
p](n$E[eF!i u$i0ar i9hG7I%nI0 4)$PS4
6L%]"X \FUU.^l0F8\'vvCO0 第四级提示符变量$PS4 , $PS4的值将被显示在“-x”选项输出的每一条命令的前面。在Bash Shell中,缺省的$PS4的值是”+”号。(现在知道为什么使用”-x”选项时,输出的命令前面有一个”+”号了吧 )
:~ W&X*s#Z].~051Testing软件测试网|T+Jy1be通过修改$PS4的值,就可以达到sh –x 时显示行号还有函数名称的目的了。51Testing软件测试网7[bm`(BA#] F
TAG:
不要让那些真正对你好的人,慢慢的从你的生活中消失,无论爱情还是友情,都需要用心经营。
我的栏目
标题搜索
日历
|
|||||||||
日 | 一 | 二 | 三 | 四 | 五 | 六 | |||
1 | 2 | 3 | 4 | 5 | 6 | ||||
7 | 8 | 9 | 10 | 11 | 12 | 13 | |||
14 | 15 | 16 | 17 | 18 | 19 | 20 | |||
21 | 22 | 23 | 24 | 25 | 26 | 27 | |||
28 | 29 | 30 |
我的存档
数据统计
- 访问量: 3335404
- 日志数: 1640
- 建立时间: 2011-12-07
- 更新时间: 2019-12-24