【问题标题】:Should I use "test" or "[" "]" in POSIX shell?我应该在 POSIX shell 中使用“test”还是“[”“]”?
【发布时间】:2016-10-26 08:32:53
【问题描述】:

我相信以下两个代码 sn-ps 在符合 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

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

【问题讨论】:

  • 是的,它们都是有效的。不,没有一个特别的理由偏爱一个而不是另一个 - 这是一种风格选择。
  • test 可能会导致进程分叉,从而降低效率。
  • @WillemVanOnsem,在test 不是内置的shell 上,那么它也将使用外部/usr/bin/[ -- 寻找它,你的操作系统确实 将其作为外部二进制文件(通常是指向与/usr/bin/test 相同的inode 的硬链接,它查看其argv[0] 以查看其调用方式并决定是否从其参数列表中丢弃尾随] )。
  • @CharlesDuffy:好的,非常感谢您指出这一点。
  • 我内心的书呆子不禁认为答案是“是”。

标签: shell posix sh


【解决方案1】:

没有功能上的差异,这使它成为一种纯粹的风格选择,没有被广泛接受的指导方针。 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 不认为-a 或-o 已过时。 POSIX Programmer's Manual (test) 我相信在 Bash 引入 -a 之后,反对使用它们的论点是 缺乏清晰度(如果文件存在则为真)。但是 POSIX 测试没有提到 && 或 ||。
  • @DavidC.Rankin, ...如果您单击该规范中给出的任何地方的[OB XSI] - 您链接到的地方 - 它会打开以下内容,解释这些代码(因此@ 987654344@ 表示已过时):pubs.opengroup.org/onlinepubs/9699919799/help/codes.html。从那里引用:“所描述的功能可能会在本卷 POSIX.1-2008 的未来版本中删除。严格符合 POSIX 应用程序和严格符合 XSI 应用程序不得使用过时的功能。”
  • @DavidC.Rankin, ...这有充分的理由:在-a 和-o 的超过四个参数的情况下,@987654347 存在歧义@ idiom 可能是必要的,以消除值和测试语法之间的解释歧义(特别是当该组值可以包括 ( 或 ) 时)。
  • 我不认为test 的清晰度是“次要”优势。我会说它远远超过使用 [ 保存的单个字符。
  • 我建议强烈优先选择test,因为关于 SO 的问题数量会导致错误 [ 和 ] 用于分组运算符。
猜你喜欢
  • 1970-01-01
  • 2012-03-10
  • 2018-09-05
  • 1970-01-01
  • 1970-01-01
  • 2014-02-13
  • 2015-07-15
  • 2011-12-31
  • 2020-10-14
相关资源
最近更新 更多