Chinaunix首页 | 论坛 | 博客
  • 博客访问: 366297
  • 博文数量: 83
  • 博客积分: 5322
  • 博客等级: 中校
  • 技术积分: 1057
  • 用 户 组: 普通用户
  • 注册时间: 2010-04-11 11:27
个人简介

爱生活,爱阅读

文章分类

全部博文(83)

文章存档

2015年(1)

2013年(1)

2012年(80)

2011年(1)

分类: LINUX

2012-03-26 18:10:02

--------------------------------------------------------------------------------------------------------------------------------

--------------------------------------收集于网络:网中人---shell 十三问》----------------------------------

--------------------------------------------------------------------------------------------------------------------------------

放了一个愉快的春节假期,人也变得懒懒散散的... 只是,答应了大家的作业,还是要坚持完成就是了~~~

还记得我们在第 10 章所介绍的 return value 吗?是的,接下来介绍的内容与之有关,若你的记忆也被假期的欢乐时光所抵消掉的话,那,建议您还是先回去温习温习再回来...

若你记得  return value ,我想你也应该记得了 && || 是甚么意思吧?用这两个符号再配搭 command group 的话,我们可让 shell script 变得更加聪明哦。比方说:

comd1 && {

    comd2

    comd3

    :

} || {

    comd4

    comd5

}

意思是说:

假如 comd1 return value true 的话,然则执行 comd2 comd3 ,否则执行 comd4 comd5

事实上,我们在写 shell script 的时候,经常需要用到这样那样的条件以作出不同的处理动作。用 && || 的确可以达成条件执行的效果,然而,从"人类语言"上来理解,却不是那么直观。更多时候,我们还是喜欢用 if .... then ... else ... 这样的 keyword 来表达条件执行。

bash shell 中,我们可以如此修改上一段代码:

 

 

if comd1

then

    comd2

    comd3

else

    comd4

    comd5

fi

这也是我们在 shell script 中最常用到的 if 判断式:

只要 if 后面的 command line 返回 true return value (我们最常用 test 命令来送出 return value),然则就执行 then 后面的命令,否则执行  else 后的命令﹔fi 则是用来结束判断式的 keyword

if 判断式中,else 部份可以不用,但 then 是必需的。( then 后不想跑任何 command ,可用" " 这个 null command 代替)。当然,then else 后面,也可以再使用更进一层的条件判断式,这在 shell script 设计上很常见。若有多项条件需要"依序"进行判断的话,那我们则可使用 elif 这样的 keyword

if comd1; then

    comd2

elif comd3; then

    comd4

else

    comd5

fi

意思是说:

comd1 true ,然则执行 comd2 ﹔否则再测试 comd3 ,然则执行 comd4

倘若 comd1 comd3 均不成立,那就执行 comd5

if 判断式的例子很常见,你可从很多 shell script 中看得到,我这里就不再举例子了...

接下来要为大家介绍的是 case 判断式。

虽然 if 判断式已可应付大部份的条件执行了,然而,在某些场合中,却不够灵活,

尤其是在 string 式样的判断上,比方如下:

QQ () {

    echo -n "Do you want to continue? (Yes/No): "

    read YN

    if [ "$YN" = Y -o "$YN" = y -o "$YN" = "Yes" -o "$YN" = "yes" -o "$YN" = "YES" ]

    then

        QQ

    else

        exit 0

    fi

}

QQ

从例中,我们看得出来,最麻烦的部份是在于判断 YN 的值可能有好几种式样。

聪明的你或许会如此修改:

...

if echo "$YN" | grep -q '^[Yy]\([Ee][Ss]\)*$'

...

也就是用 Regular Expression 来简化代码。(我们有机会再来介绍 RE)只是... 是否有其它更方便的方法呢?有的,就是用 case 判断式即可:

 

QQ () {

    echo -n "Do you want to continue? (Yes/No): "

    read YN

   case "$YN" in

        [Yy]|[Yy][Ee][Ss])

            QQ

            ;;

        *)

            exit 0

            ;;

    esac

}

QQ

我们常 case 的判断式来判断某一变量在同的值(通常是 string)时作出不同的处理,

比方说,判断 script 参数以执行不同的命令。若你有兴趣、且用 linux 系统的话,不妨挖一挖 /etc/init.d/* 里那堆 script 中的  case 用法。

如下就是一例:

case "$1" in

  start)

        start

        ;;

  stop)

        stop

        ;;

  status)

        rhstatus

        ;;

  restart|reload)

        restart

        ;;

  condrestart)

        [ -f /var/lock/subsys/syslog ] && restart || :

        ;;

  *)

        echo $"Usage: $0 {start|stop|status|restart|condrestart}"

        exit 1

esac

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


阅读(843) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~