linux – bash中双方括号和单方括号有什么区别?

我只是想知道究竟是什么区别

[[ $STRING != foo ]]

[ $STRING != foo ]

除了后者是posix兼容的,在sh中发现,前者是在bash中发现的扩展.

最佳答案
有几个不同之处.在我看来,一些最重要的是:

> [是Bash内置的许多其他现代炮弹.内置[类似于测试以及关闭的额外要求].内置[并测试模拟功能/ bin / [和/ bin / test及其限制,以便脚本向后兼容.原始可执行文件仍然主要用于POSIX兼容性和向后兼容性.运行命令类型[在Bash中表示[默认情况下解释为内置]. (注意:哪个[仅查找PATH上的可执行文件,相当于类型-p [)
> [[不兼容,它不一定适用于/ bin / sh指向的任何内容.所以[[更现代的Bash / Zsh / Ksh选项.
>因为[[内置于shell中并且没有遗留的要求,所以您不必担心基于IFS变量的单词拆分,以搞砸评估为带空格的字符串的变量).因此,您实际上不需要将变量放在双引号中.

在大多数情况下,其余部分只是一些更好的语法.为了看到更多的差异,我推荐这个链接到FAQ答案:What is the difference between test, [ and [[ ?.事实上,如果你认真对待bash脚本,我建议你阅读整个wiki,包括FAQ,Pitfalls和Guide. The test section from the guide section也解释了这些差异,以及为什么作者认为[[如果你不需要担心便携性,那么这是一个更好的选择].主要原因是:

>您不必担心引用测试的左侧,以便实际将其作为变量读取.
>你不必逃避小于和大于< >使用反斜杠,以便它们不被评估为输入重定向,这可能通过覆盖文件真的搞砸了一些东西.这再次回到[[是一个内置的.如果[(test)是一个外部程序,那么shell必须以它评估的方式做出异常<和>只有在调用/ bin / test时才会有意义.

转载注明原文:linux – bash中双方括号和单方括号有什么区别? - 代码日志