我相信以下两个代码片段在符合 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
首选哪种语法?为什么?在某些情况下是否有理由使用其中一种而不是另一种?
没有功能差异,这纯粹是风格选择,没有广泛接受的指导方针。 bash-hackers wiki(由 Wayback Machine @ archive.org 存档),标题为“经典测试命令”的页面有一个关于经典(POSIX 兼容)的扩展部分
test
,非常关注最佳实践和陷阱,并且不采取任何立场。
test
的 POSIX.1(-2017) 规范 - 虽然它确实标记了大量已过时的功能1 - 指定这两种形式都不优于另一种形式。
也就是说,
test
的一个优点是,它不太利于人们引入其他语言的期望,从而导致代码损坏或有错误。例如,写 [$foo=1]
而不是正确的 [ "$foo" = 1 ]
是一个常见的错误,但人们并不普遍写 test$foo=1
:从视觉上更明显看出 test "$foo" = 1
遵循与其他 shell 相同的解析规则命令,因此需要同样注意引用和空格。
[1] 例如
-a
、-o
、(
和 )
,以及任何具有四个以上参数的用法(不包括以名称 ]
启动的实例上的尾随 [
) .