对shell脚本里if语句的一点剖析

  写过shell脚本的肯定写过这样一段:

if [ -d dir ]
then
    echo"success"
else
    echo"failed"
fi

 
  凡是说到if的时候书里都会提到这么两条规则:
  1、“[”的右边和“]”的左边必须有空格;
  2、如果要把then和if放到同一行,就要加个分号,写成 if [-d /bin]; then 这样的形式。

  大多数的书都介绍到这里就为止了,我也一度死记硬了这两条规则,我还一直认为shell脚本没规律、记不住、太难写。其实不然,直到今天我才发现:

roovent@ubuntu-desktop:~ $ which [
/usr/bin/[

  原来“[”是个命令,和ls、rm一样是一个命令。经查,“[”命令和test命令的功能、用法都基本一样,在有的版本的linux中“[”就是test的一个链接。
  这就好解释了,[ -d 其实就是一个命令带一个参数,就像ls –a,命令和参数之间当然必须有空格。只不过“[”有一点特殊,它的最后一个参数必须是“]”,参数之间也必须有空格,这就很好解释第一条规则。then和if放到同一行,就要在“]”后加个分号来告诉“[”命令到此结束,不然就会把then当成最后一个参数了。
  好了,原来一切都是这么合情合理,shell脚本的设计者不会没事找事搞那么复杂,只是“[”这么奇怪的命令名不太能接受罢了。
  最后再多说一句,if后面可以跟各种语句,比如if echo “hello”也是合法的,判断的依据就是这条语句是否执行成功,当然了if后面跟着用&&或||连接的多条语句也是可以的。

-----------------------------------------------------
- 原创文章,转载请注明出处。
- 博 客 园:http://www.cnblogs.com/roovent/
- 百度空间:http://hi.baidu.com/roovent/home
- 电子邮箱:yangq.nj#gmail.com
-----------------------------------------------------

posted @ 2010-12-11 23:46  YangQ  阅读(1054)  评论(0编辑  收藏  举报