【问题标题】:Meaning of double square brackets in bash [duplicate]bash中双方括号的含义[重复]
【发布时间】:2013-01-24 08:00:03
【问题描述】:

在这个question in the answer from Kyle Brandt [[ ]] 构造被描述为“bash 内置测试命令”。下面作为示例显示。

  if [[ ( $a -gt 2 ) && ( $a -lt 5 ) ]]; then ...

为什么需要双方括号,即[[ ]]

【问题讨论】:

    标签: bash


    【解决方案1】:

    [[ 是 bash 中 [ 的更通用版本。

    例如,使用 [[ ... ]] 测试构造而不是 [ ... ] 可以防止脚本中的许多逻辑错误。例如,&&、||、 运算符在 [[ ]] 测试中工作,尽管在 [] 构造中给出错误。

    另外,它们的实现方式不同

    -bash-3.2$ type [
    [ is a shell builtin
    -bash-3.2$ type [[
    [[ is a shell keyword
    

    请参考here 以获得更好的解释

    【讨论】:

    • 比那更糟; [ "$this" > "$that" ] 不会出错,它只会做一些与你预期完全不同的事情。 (具体:将输出重定向到$this指定的文件,然后测试$that是否为非空。)
    【解决方案2】:

    [[ ]] 等于 test 关键字。

    您也可以使用[ ],但[[ ]] 并非与所有外壳类型都兼容

    对我来说,如果我理解问题的真正含义,那么问题本身并没有很好地表述。
    这些括号必须在这里不是为了确定顺序,而是因为 bash 概要需要它们

    编辑

    问题变了,所以我的回答也是。

    [[ ]] 用于[ ],因为您不必担心引用将作为变量读取的测试的左侧。
    而且<>不需要转义

    【讨论】:

    • 如果我可以使用[ ],你是说永远没有理由使用[[ ]]
    • 你说得对,操作顺序与问题无关,所以我编辑了问题以删除任何提及 ( ) 确定操作顺序的内容。
    • @broiyan:如果你不担心便携性,有人支持[[ ]]更好,因为你不必担心引用左侧的测试会被读取作为变量。而且<>不需要转义
    • @broiyan:看看我的更新
    • 快速滚动浏览此链接wiki.bash-hackers.org/commands/classictest 似乎没有找到任何关于为什么将方括号加倍的信息。我不知道你所说的测试的“左侧”是什么意思。
    猜你喜欢
    • 2014-07-22
    • 2012-11-12
    • 2010-10-14
    • 1970-01-01
    • 2010-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-07
    相关资源
    最近更新 更多