我应该在POSIX shell中使用“test”或“[”“]”吗?

时间:2016-06-23 20:28:53

标签: shell posix sh

我相信以下两个代码段在符合POSIX标准的shell中都有效:

选项1:

if [ "$var" = "dude" ]
then
  echo "Dude, your var equals dude."
fi

选项2:

if test "$var" = "dude"
then
  echo "Dude, your var equals dude."
fi

首选哪种语法?为什么?在某些情况下,是否有理由使用其中一种?

1 个答案:

答案 0 :(得分:7)

没有任何功能差异,使其成为纯粹的风格选择,没有广泛接受的指导方针。 The bash-hackers wiki有一个关于经典(POSIX兼容)test的扩展部分,对最佳实践和陷阱有很多关注,并且没有任何优先选择的位置。

此外,the POSIX specification for test - 虽然 标记了大量功能过时的 1 - 指明这两种形式都不是另一种形式。

尽管如此,test的一个优点是,它不太有利于人们从其他语言中引入期望导致代码损坏或错误。例如,写[$foo=1]而不是正确的[ "$foo" = 1 ]是一个常见的错误,但人们并没有广泛看到写test$foo=1:它还有更多在视觉上显而易见的是test "$foo" = 1遵循与其他shell命令相同的解析规则,因此需要关于引用和空格的相同关注。

[1] 例如-a-o(),以及超过四个参数的任何用法(不包括在名为])的实例上追踪[