shell脚本中有趣的[ ]

2023-06-20 16:26:41 浏览数 (2)

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

代码语言:javascript复制
if[-d dir]
then
      echo"success"
else
      echo"failed"
fi

  凡是说到if的时候书里都会提到这么两条规则:

1、“[”的右边和“]”的左边必须有空格;

2、如果要把then和if放到同一行,就要加个分号,写成 if [-d /bin];then 这样的形式。

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

代码语言:javascript复制
zhxia@core01 ~$ which [
/usr/bin/[

原来“[”是个命令,和ls、rm一样是一个命令。经查,“[”命令和test命令的功能、用法都基本一样,在有的版本的linux中“[”就是test的一个链接。

  这就好解释了,[ -d 其实就是一个命令带一个参数,就像ls –a,命令和参数之间当然必须有空格。只不过“[”有一点特殊,它的最后一个参数必须是“]”,参数之间也必须有空格,这就很好解释第一条规则。then和if放到同一行,就要在“]”后加个分号来告诉“[”命令到此结束,不然就会把then当成最后一个参数了。

  好了,原来一切都是这么合情合理,shell脚本的设计者不会没事找事搞那么复杂,只是“[”这么奇怪的命令名不太能接受罢了。

  最后再多说一句,if后面可以跟各种语句,比如if echo “hello”也是合法的,判断的依据就是这条语句是否执行成功,当然了if后面跟着用&&或||连接的多条语句也是可以的。

0 人点赞