我应该在 POSIX shell 中使用 "test" 还是“[” “]”?

Should I use "test" or "[" "]" in POSIX shell?

我相信以下两个代码片段在 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

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

没有功能上的差异,这使它成为一种纯粹的风格选择,没有广泛接受的准则。 The bash-hackers wiki 有一个关于经典(POSIX 兼容)test 的扩展部分,对最佳实践和陷阱给予了极大的关注,并且没有采取任何立场。

此外,the POSIX specification for test——虽然它确实标记了大量功能已过时1——没有指定任何形式比其他人更喜欢。

也就是说,test 的一个优点是它不利于人们从其他语言中引入期望,从而导致代码损坏或错误。例如,写 [$foo=1] 而不是正确的 [ "$foo" = 1 ] 是一个常见的错误,但人们并不普遍认为写 test$foo=1test "$foo" = 1 在视觉上更明显遵循与其他 shell 命令相同的解析规则,因此需要同样注意引号和空格。


[1] 例如 -a-o(),以及超过四个参数(不包括以名称 [ 启动的实例的尾随 ])。