在bash中,双方括号和单方括号的区别是什么?

分享于 

5分钟阅读

互联网

 

问题:

我只是想知道什么是


[[ $STRING!= foo ]]




[ $STRING!= foo ]



除了后者是posix兼容,在ssh中找到了,前者是bash中的一个扩展。


回答 1:

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

  • [ 是Bash和许多其他现代shell中的内置。 内置 [test 类似,要求关闭 ]的附加要求。 builtins [test 模仿功能 /bin/[/bin/test 以及它们的限制,这样脚本就可以向后兼容。 最初的可执行文件仍然存在于POSIX兼容性和向后兼容性方面。 在Bash中运行命令 type [ 表明 [ 默认被解释为内置的。 ( 注:which [ 只在路径中查找可执行文件,并且等效于 type -p [ )
  • [[ 并不兼容,它不一定能与任何 /bin/sh 指向。 所以 [[ 是更现代的Bash/Zsh/Ksh 选项。
  • 因为 [[ 内置于 shell,不具有传统需求,所以无需担心基于 IFS变量 splitting mess evaluate的变量 mess evaluate字符串 evaluate。 因此,你不需要将变量放在双引号中。
  • 在大多数情况下,剩下的只是一些更好的语法。 要查看更多差异,我建议将这里链接与常见问题解答联系起来: :测试,[ 和[ [ 之间的区别是什么? 实际上,如果你认真考虑bash脚本,我推荐阅读整个 wiki插件,包括 FAQ,陷阱,以及指南。 在参考手册 explains解释这些差异,如果你不需要担心 being portable,那么作者认为 [[ 是更好的选择。 主要原因如下:

  • 你不必担心引用测试的左侧,以便它实际上被读取为变量。
  • 使用反斜杠,不必将小于和 GREATER 转换为 <>,以便它们不会被计算为输入重定向。 这又回到 [[ 成为内置的。 如果[ ( 测试) 是外部程序,则 shell 只在调用 /bin/test 时对 <> 进行评估,并不真正意义上。

回答 2:

简而言之:

[ 是一个 bash 内置

[[ ] ] 是 bash 关键字

关键词: 关键字非常相似,但是主要区别是特殊的解析规则适用于它们。 例如[ 是一个bash内置,而[ [ 是一个bash关键字。 它们都用于测试内容,但是由于[ [ 是一个关键字而不是内置,它从几个特殊的解析规则中


 $ [ a <b ]


 -bash: b: No such file or directory


 $ [[ a <b ]]



第一个示例返回一个错误,因为bash试图将文件b 重定向到命令 [ a ]。 第二个示例实际上执行你所期望的操作。 字符 <不再具有它的文件重定向运算符的特殊含义。

源:http://mywiki.wooledge.org/BashGuide/CommandsAndArguments


回答 3:

快速阅读文档说明书的相关部分,主要区别在于 ==!= 运算符 MATCH 针对 Pattern 而不是字符串,也可能存在 =~ 正规表达式 比较操作符。


回答 4:

Bracket Bracket [] is符合条件表达式的POSIX shell。

这是标准POSIX版本的增强的( 或者扩展) 版本,它由bash和其他 shells(zsh,ksh) 支持,这是一个增强的。

在bash中,我们使用 eqneltgt,用双括号来比较,可以使用 ==!=<,>

  • [ 是测试命令的同义词。 即使它是内置到 shell 中,它也会创建一个新进程。
  • [[ 是一个新的改进版本,它是关键字,而不是程序。

例如:


[ var1 lt var2] #works


[ var1 <var2] #error: var2 No such file or directory 


[ var1 <var2] #works with escape


[[ var1 <var2]] #works





SIN  DIFF  BASH  不同  Double  Brackets  
相关文章