什么';Bash中[and[]的区别是什么?

什么';Bash中[and[]的区别是什么?,bash,Bash,我查看了bash手册页,其中[说明它使用了条件表达式。然后我查看了条件表达式部分,它列出了与test(和[)相同的运算符 所以我想知道,Bash中的[和[有什么区别?在Bash中,与[相反,[防止了变量值的分词。[是Bash对的改进[命令。它有几个增强功能,如果您编写的脚本以bash为目标,它将是一个更好的选择。我最喜欢的是: 它是shell的一个语法特性,因此它有一些特殊的行为,[没有。你不再需要像疯狂一样引用变量,因为[更直观地处理空字符串和带空格的字符串。例如,对于[,你必须编写 if [

我查看了bash手册页,其中
[
说明它使用了条件表达式。然后我查看了条件表达式部分,它列出了与
test
(和
[
)相同的运算符


所以我想知道,Bash中的
[
[
有什么区别?

在Bash中,与
[
相反,
[
防止了变量值的分词。

[
是Bash对
的改进[
命令。它有几个增强功能,如果您编写的脚本以bash为目标,它将是一个更好的选择。我最喜欢的是:

  • 它是shell的一个语法特性,因此它有一些特殊的行为,
    [
    没有。你不再需要像疯狂一样引用变量,因为
    [
    更直观地处理空字符串和带空格的字符串。例如,对于
    [
    ,你必须编写

    if [ -f "$file" ]
    
    正确处理空字符串或带有空格的文件名。对于
    [[
    不需要引号:

    if [[ -f $file ]]
    
  • 因为它是一种语法功能,所以可以使用
    &&
    |
    运算符进行布尔测试,并使用
    进行字符串比较。
    [
    无法执行此操作,因为它是常规命令,
    &&
    |
    不会作为命令行参数传递给常规命令

  • 它有一个很棒的
    =~
    操作符,用于进行正则表达式匹配

    if [ "$answer" = y -o "$answer" = yes ]
    
    使用
    [[
    您可以将其编写为

    if [[ $answer =~ ^y(es)?$ ]]
    
    它甚至允许您访问存储在
    BASH\u REMATCH
    中的捕获组。例如,
    ${BASH\u REMATCH[1]}
    如果您在上面键入完整的“yes”,则将是“es”

  • 你可以免费获得模式匹配(也称为globbing)。也许你对如何键入“是”的要求不那么严格。如果用户键入y-任何内容,也许你都可以。你的保险范围包括:

    if [[ $ANSWER = y* ]]
    
  • 请记住,它是一个bash扩展,因此如果您正在编写与sh兼容的脚本,那么您需要坚持使用
    [
    。如果使用双括号,请确保您的脚本有
    #!/bin/bash
    shebang行

    另见
        • [
          测试
          内置相同,工作原理类似于
          测试
          二进制(人工测试)
          • 在许多类似UNIX的环境中,在所有其他基于sh的shell中的工作原理与
            [
            大致相同
          • 仅支持单个条件。使用bash
            &&
            |
            运算符的多个测试必须放在单独的括号中
          • 本机不支持“not”运算符。若要反转条件,请在第一个括号外使用
            以使用shell的工具反转命令返回值
          • =
            !=
            是文本字符串比较
        • [[
          是一个bash
          • 是特定于bash的,尽管其他shell可能已经实现了类似的构造
          • =
            !=
            应用bash模式匹配规则,请参阅
            man bash中的“模式匹配”
          • 具有
            =~
            正则表达式匹配运算符
          • 允许使用括号和括号内的
            &&
            |
            逻辑运算符组合子表达式

        除此之外,它们非常相似——大多数单独的测试在它们之间工作相同,只有当您需要将不同的测试与逻辑AND/OR/NOT操作相结合时,事情才会变得有趣。

        最重要的区别在于代码的清晰性。是的,是的,上面所说的是正确的,但是[]]使您的代码符合您在高级语言中的期望,特别是关于AND(&&),或(|),而不是()操作员。因此,当您在系统和语言之间移动时,您将能够更快地解释脚本,从而使您的生活更轻松。从一个好的UNIX/Linux参考资料中获取细节。您可能会发现某些细节在某些情况下很有用,但您将始终欣赏清晰的代码!您更喜欢哪个脚本片段阅读?即使脱离上下文,第一个选择也更容易阅读和理解



        很好,除了[[在ksh和最近的POSIX sh specifications.FWIW中也存在]之外,可以进入
        [
        [
        中的条件表达式集(如
        -f
        -z
        等)的引用位于@Darron,我在特定服务器中使用Ubuntu,我的sh(实际上是dash版本0.5.8)不支持[[测试支持使用-a和-o的多个条件。此外,它还具有not运算符,例如if[!-z x];然后是回音Y;fi@AnthonyRutledge你能更具体地说明你的意思吗?为什么?对于那些登陆这里想知道键入什么来查看
        -n
        -z
        -ge
        -eq
        -d
        等手册页的人来说,答案是
        人测
        。尽管其他答案在技术上是正确的,但这是唯一的答案只有一个是完全正确的。“最重要的区别在于代码的清晰性。”:不,区别在于
        [
        是一个命令,而
        [
        是一个语法元素(“保留字”)。因此不同的解析。不?我只是说实际的区别。
        [[]]如果我没有弄错的话,
        是通往
        的捷径。说到底,确实存在语法上的差异,但对于外行来说,最重要的是阅读的方便性和可维护性。因此,这就是为什么我说“最重要”,而不是“仅”或“根据具体书籍”的差异。
        
        if [[ -d $newDir && -n $(echo $newDir | grep "^${webRootParent}") && -n $(echo $newDir | grep '/$') ]]; then ...
        
        if [ -d "$newDir" -a -n "$(echo "$newDir" | grep "^${webRootParent}")" -a -n "$(echo "$newDir" | grep '/$')" ]; then ...