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

Modified on: Tue, 12 Nov 2019 16:00:03 +0800

我只是想知道

之间究竟有什么区别

[[ $STRING != foo ]]

[ $STRING != foo ]

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

作者:0x89

最佳答案

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

  1. [是Bash内置的许多其他现代shell。内置[类似于test,需要关闭]。内置的[test模仿功能/bin/[/bin/test及其限制,以便脚本将向后兼容。原始可执行文件仍然主要用于POSIX兼容性和向后兼容性。在Bash中运行命令type [>表示[默认情况下被解释为内置函数。 (注意:which [仅查找 PATH 上的可执行文件,等同于type -p [
  2. [[不兼容,它通常不适用于/bin/sh指向的任何内容。所以[[是更现代的Bash / Zsh / Ksh选项。
  3. 因为[[]内置于shell中并且没有遗留要求,所以您不必担心基于 IFS 变量的分词会搞砸对于使用空格求值的变量的变量。因此,您实际上不需要将变量放在双引号中。
  4. 醇>

    在大多数情况下,其余部分只是一些更好的语法。要查看更多差异,我建议将此链接指向常见问题解答答案:test,[和[[有什么区别] ?。事实上,如果你认真对待bash脚本,我建议你阅读整个wiki,包括FAQ,陷阱和指南。 指南部分的测试部分解释了这些差异,以及为什么作者认为[[是一个更好的选择,如果你不需要担心便携性。主要原因是:

    1. 您不必担心引用测试的左侧,以便实际将其作为变量读取。
    2. 你不必逃避小于和大于< >,以便它们不被评估为输入重定向,这可能会通过覆盖文件来解决一些问题。这再次回到[[是一个内置的。如果[(test)是一个外部程序,那么只有当<,这实际上没有意义。
    3. 醇>

相关问答

添加新评论