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

标签 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

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

最佳答案

没有功能差异,这使其成为一种纯粹的风格选择,没有广泛接受的指导方针。 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 , () ,以及具有四个以上参数的任何用法(不包括以名称 ] 开始的实例上的尾随 [ )。

关于shell - 我应该在 POSIX shell 中使用 "test"还是 "[" "]"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38001248/

相关文章:

bash - 如何检查文件名是否与 shell 脚本中的正则表达式匹配

Bash Completion 脚本在某些参数选项后完成文件路径

shell - 如何在 POSIX shell 脚本中迭代字符串的字符?

c - 两个 fork 进程之间的消息队列导致来自 msgsnd 的参数无效

string - 在 bash 中使用回车执行字符串比较

shell脚本中的MySQL用户定义函数

linux - 查找一行并替换一个字符串

shell - 如何在 clozure cl 中杀死一组进程?

c - 管道系统调用

shell - 如何在 Makefile 中定义全局 shell 函数?