SHELL十三问之十二:你要 if 还是 case 呢?

还记得我们在第10 章所介绍的 return value 吗?BSD爱好者乐园"['r v%a1h rY

-~9PexY"Q%O0s;T-/1若你记得  return value ,我想你也应该记得了 && 与 || 是甚么意思吧?
#o-X)DZ4RXD#b1用这两个符号再配搭 command group 的话,我们可让 shell script 变得更加聪明哦。
{g_s@,F1比方说:
BSD爱好者乐园_hw9M'l"i1eB

comd1 && {
3K GKG _P1    comd2BSD爱好者乐园wm3`B:o~#y#D3z
    comd3
A^D5z3qf1} || {
[2L2K?2u*I%j#X1    comd4
7R!yL#E /o0L:K$N1    comd5
,n9l@U7|~1Ha8`1}
BSD爱好者乐园 RwJy[

意思是说:BSD爱好者乐园M3/8M/C4DA[

假如comd1 的 return value 为 true 的话,BSD爱好者乐园fK7NHf2i
然则执行 comd2 与 comd3 ,
"BQ0|AK,^,/fX1否则执行 comd4 与 comd5 。BSD爱好者乐园0YR)Yf,F+P�r0W

X3jo$@F1事实上,我们在写 shell script 的时候,经常需要用到这样那样的条件以作出不同的处理动作。
#ev0]6zg4{/FY1用 && 与 || 的确可以达成条件执行的效果,然而,从"人类语言"上来理解,却不是那么直观。
'n3hm!S/A4p5Z1更多时候,我们还是喜欢用 if .... then ... else ... 这样的 keyword 来表达条件执行。
JlH"/ c1在 bash shell 中,我们可以如此修改上一段代码:
BSD爱好者乐园.f|5@;Gz)U

if comd1
,j@"V3wo2e1then
`Y v([sx WO1    comd2
.P`;@W0OP4ulb)U5U1    comd3
su$n3b`/n(t1elseBSD爱好者乐园;]eF,pQ
    comd4
w`#m"x1Wr�w.N+c1    comd5BSD爱好者乐园 `(p*[ x2BI4d9VZ2RV
fi
BSD爱好者乐园;AM5mk } v2m

这也是我们在shell script 中最常用到的 if 判断式:BSD爱好者乐园Ze+N `)A'b ?I%gN

只要if 后面的 command line 返回 true 的 return value (我们最常用 test 命令来送出 return value),然则就执行 then 后面的命令,否则执行  else 后的命令﹔fi 则是用来结束判断式的 keyword 。
.jA&Pf3oZ-Siw|E1BSD爱好者乐园-e4@0o+K p
在 if 判断式中,else 部份可以不用,但 then 是必需的。BSD爱好者乐园Y*e&iN[b+g7ZY h
(若 then 后不想跑任何 command ,可用" : " 这个 null command 代替)。
|X7gu]E1当然,then 或 else 后面,也可以再使用更进一层的条件判断式,这在 shell script 设计上很常见。
C vGf!G K1若有多项条件需要"依序"进行判断的话,那我们则可使用 elif 这样的 keyword :
BSD爱好者乐园YC1{9BN

if comd1; then
Tdeq `/w rO1    comd2BSD爱好者乐园m)yN u F:ic
elif comd3; then
e3| o v6M1    comd4BSD爱好者乐园E-F'ay FUl*w(g}
elseBSD爱好者乐园_x$yn)AI
    comd5BSD爱好者乐园0F*R}uI[0v
fi
BSD爱好者乐园q juuT

意思是说:BSD爱好者乐园 b"lr.OrU

comd1 为 true ,然则执行 comd2 ﹔BSD爱好者乐园.~&Q0rX[ z[)ZM%p]x
否则再测试 comd3 ,然则执行 comd4 ﹔
`q'uR ?Bl/x1倘若 comd1 与 comd3 均不成立,那就执行 comd5 。BSD爱好者乐园NS8NW.Q`

z?�cB3QH1if 判断式的例子很常见,你可从很多 shell script 中看得到,我这里就不再举例子了...BSD爱好者乐园$h2C;PbN
BSD爱好者乐园}W~I@
接下来要为大家介绍的是 case 判断式。
/F'E-l_b$/*H1虽然 if 判断式已可应付大部份的条件执行了,然而,在某些场合中,却不够灵活,尤其是在 string 式样的判断上,比方如下:

2s K(Z!l3c)SM*g1

QQ () {BSD爱好者乐园A7l1lqth!j&B0/
    echo -n "Do you want to continue? (Yes/No): "
:N(a*a-eu,T1    read YNBSD爱好者乐园,JpJ:|]�j7y;v
    if [ "$YN" = Y -o "$YN" = y -o "$YN" = "Yes" -o "$YN" = "yes" -o "$YN" = "YES" ]
s1J `gL�y t+Sb_1    thenBSD爱好者乐园x'pvb6i9K6L_7e
        QQBSD爱好者乐园`f!X e$Q#Q
    else
1}7q F�gaj1        exit 0
Z&~va0M{/[ hr1    fiBSD爱好者乐园 h J ms0V }i]I
}
$Y(c�X-W$WC.Su1QQ

Ok]O9b U~.D0O1

从例中,我们看得出来,最麻烦的部份是在于判断YN 的值可能有好几种式样。
ar+X{*fJ u6QN1聪明的你或许会如此修改:

1P4xPN7yLr$|/Cf!dy1

...
G9YWoD ]1if echo "$YN" | grep -q '^[Yy]/([Ee][Ss]/)*$'BSD爱好者乐园"Tc qL MT`
...

X3dQht,U1A'N/r1

也就是用Regular Expression 来简化代码。(我们有机会再来介绍 RE)BSD爱好者乐园8K4?7g5f+z0Z
只是... 是否有其它更方便的方法呢?
1X#sF0JF&o#v?1有的,就是用 case 判断式即可:

{6g(Y;k'r}Q1

QQ () {
P8e*m LML*Q(wS(u1    echo -n "Do you want to continue? (Yes/No): "BSD爱好者乐园+i/O }.k7P
    read YNBSD爱好者乐园q(f#e [v8M&m*bw0Y+V1Wj
   case "$YN" inBSD爱好者乐园KL+C huDJ
        [Yy]|[Yy][Ee][Ss])BSD爱好者乐园n2ej�k [8L7ja;U)Y
            QQBSD爱好者乐园 R3[ U2`HP q'BrR&{
            ;;
DA_l"H1        *)
)NbpV'hX] rHx5B1            exit 0
)g&g;@x}"o1            ;;BSD爱好者乐园^'P3U ^t+`P ?F
    esac
W~?;[v$t1}
p$B)TOt1n_ ?'@1QQ
BSD爱好者乐园D5ZU&u%Cp9p8f

我们常case 的判断式来判断某一变量在同的值(通常是 string)时作出不同的处理,
zQ/[0S`,t.U2^J1比方说,判断 script 参数以执行不同的命令。
/A0}#S�phM3]+p%/1若你有兴趣、且用 Linux 系统的话,不妨挖一挖 /etc/init.d/* 里那堆 script 中的  case 用法。
A~J/n~/1如下就是一例:

r,Q,x w8FY1

case "$1" in
"oQPtgBB1  start)
[!_{+l#e x!HAI1        startBSD爱好者乐园5@ N H P+k8sb}l.xB4q
        ;;BSD爱好者乐园 n"a2Pe L8j#O o A
  stop)
n iAX`%l1        stopBSD爱好者乐园DI5y8M9x&m/q!ktW,j5L9S
        ;;BSD爱好者乐园){9s](s3j
  status)
SLS{ I1        rhstatusBSD爱好者乐园4uY$Z g-d
        ;;BSD爱好者乐园!h4u-V vI3YDt
  restart|reload)
l!v7k4L3{:Gv1        restart
3z|9}z}H7do1        ;;
)n'd/V:p"/8W,uW$T+H8K Hn1  condrestart)BSD爱好者乐园7s;r)A-H Mqh'b3mM
        [ -f /var/lock/subsys/syslog ] && restart || :
'b.W g$QM6J1        ;;
ZCf"/{(FCFf1  *)BSD爱好者乐园k8Z*g%d[
        echo $"Usage: $0 {start|stop|status|restart|condrestart}"BSD爱好者乐园L;H%s,X:p/e/M
        exit 1BSD爱好者乐园,w$lni9/ v)u
esac
BSD爱好者乐园qT/xLf"q

(若你对 positional parameter 的印像已经模糊了,请重看第 9 章吧。)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值