我应该在 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=1
: test "$foo" = 1
在视觉上更明显遵循与其他 shell 命令相同的解析规则,因此需要同样注意引号和空格。
[1] 例如 -a
、-o
、(
和 )
,以及超过四个参数(不包括以名称 [
启动的实例的尾随 ]
)。
我相信以下两个代码片段在 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=1
: test "$foo" = 1
在视觉上更明显遵循与其他 shell 命令相同的解析规则,因此需要同样注意引号和空格。
[1] 例如 -a
、-o
、(
和 )
,以及超过四个参数(不包括以名称 [
启动的实例的尾随 ]
)。