shell十三问-12) 你要 if 还是 case 呢

放了一��愉快的春�假期,人也�得��猩⑸⒌�... 只是,答��了大家的作�I,�是要�猿滞瓿删褪橇�~~~

��得我��在第 10 章所介�B的 return value �幔�
是的,接下�斫榻B的�热菖c之有�P,若你的���也被假期的�g��r光所抵消掉的�,
那,建�h您�是先回去�亓��亓�再回��...

若你�得  return value ,我想你也����得了 && �c || 是甚�N意思吧?
用�@���符�再配搭 command group 的�,我��可� shell script �得更加�明哦。
比方�f:
 

  1. comd1 && {
     
  2.     comd2
     
  3.     comd3
     
  4.     :
     
  5. } || {
     
  6.     comd4
     
  7.     comd5
     
  8. }
复制代码


意思是�f:
 

    假如 comd1 的 return value �� true 的�,
    然�t�绦� comd2 �c comd3 ,
    否�t�绦� comd4 �c comd5 。



事��上,我��在�� shell script 的�r候,�常需要用到�@�幽�拥�l件以作出不同的�理�幼鳌�
用 && �c || 的�_可以�_成�l件�绦械男Ч�,然而,��"人��Z言"上�砝斫猓��s不是那�N直�^。
更多�r候,我���是喜�g用 if .... then ... else ... �@�拥� keyword �肀磉_�l件�绦小�
在 bash shell 中,我��可以如此修改上一段代�a:
 

  1. if comd1
     
  2. then
     
  3.     comd2
     
  4.     comd3
     
  5. else
     
  6.     comd4
     
  7.     comd5
     
  8. fi
复制代码


�@也是我��在 shell script 中最常用到的 if 判�嗍剑�
 

    只要 if 後面的 command line 返回 true 的 return value (我��最常用 test 命令�硭统� return value),
    然�t就�绦� then 後面的命令,否�t�绦�  else 後的命令�rfi �t是用�斫Y束判�嗍降� keyword 。



在 if 判�嗍街校�else 部份可以不用,但 then 是必需的。
(若 then 後不想跑任何 command ,可用" : " �@�� null command 代替)。
��然,then 或 else 後面,也可以再使用更�M一�拥�l件判�嗍剑��@在 shell script �O�上很常�。
若有多��l件需要"依序"�M行判�嗟脑�,那我���t可使用 elif �@�拥� keyword :
 

  1. if comd1; then
     
  2.     comd2
     
  3. elif comd3; then
     
  4.     comd4
     
  5. else
     
  6.     comd5
     
  7. fi
复制代码


意思是�f:
 

    若 comd1 �� true ,然�t�绦� comd2 �r
    否�t再�y� comd3 ,然�t�绦� comd4 �r
    倘若 comd1 �c comd3 均不成立,那就�绦� comd5 。



if 判�嗍降睦�子很常�,你可�暮芏� shell script 中看得到,我�@�e就不再�e例子了...

接下�硪��榇蠹医榻B的是 case 判�嗍健�
�m然 if 判�嗍揭芽��付大部份的�l件�绦辛耍�然而,在某些�龊现校��s不�蜢`活,
尤其是在 string 式�拥呐�嗌希�比方如下:
 

  1. QQ () {
     
  2.     echo -n "Do you want to continue? (Yes/No): "
     
  3.     read YN
     
  4.     if [ "$YN" = Y -o "$YN" = y -o "$YN" = "Yes" -o "$YN" = "yes" -o "$YN" = "YES" ]
     
  5.     then
     
  6.         QQ
     
  7.     else
     
  8.         exit 0
     
  9.     fi
     
  10. }
     
  11. QQ
复制代码


�睦�中,我��看得出�恚�最麻�┑牟糠菔窃陟杜�� YN 的值可能有好�追N式�印�
�明的你或�S��如此修改:
 

  1. ...
     
  2. if echo "$YN" | grep -q '^[Yy]\([Ee][Ss]\)*$'
     
  3. ...
复制代码


也就是用 Regular Expression �砗�化代�a。(我��有�C��再�斫榻B RE)
只是... 是否有其它更方便的方法呢?
有的,就是用 case 判�嗍郊纯桑�
 

  1. QQ () {
     
  2.     echo -n "Do you want to continue? (Yes/No): "
     
  3.     read YN
     
  4.    case "$YN" in
     
  5.         [Yy]|[Yy][Ee][Ss])
     
  6.             QQ
     
  7.             ;;
     
  8.         *)
     
  9.             exit 0
     
  10.             ;;
     
  11.     esac
     
  12. }
     
  13. QQ
复制代码


我��常用 case 的判�嗍�砼�嗄骋蛔�量在不同的值(通常是 string)�r作出不同的�理,
比方�f,判�� script ��狄�绦胁煌�的命令。
若你有�d趣、且用 Linux 系�y的�,不妨挖一挖 /etc/init.d/* �e那堆 script 中的  case 用法。
如下就是一例:
 

  1. case "$1" in
     
  2.   start)
     
  3.         start
     
  4.         ;;
     
  5.   stop)
     
  6.         stop
     
  7.         ;;
     
  8.   status)
     
  9.         rhstatus
     
  10.         ;;
     
  11.   restart|reload)
     
  12.         restart
     
  13.         ;;
     
  14.   condrestart)
     
  15.         [ -f /var/lock/subsys/syslog ] && restart || :
     
  16.         ;;
     
  17.   *)
     
  18.         echo $"Usage: $0 {start|stop|status|restart|condrestart}"
     
  19.         exit 1
     
  20. esac
复制代码


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

okay,十三���剩一��而已,�^�滋煸�砀愣ㄖ�....  ^_^
 

你可能感兴趣的:(shell,十三问)