【问题标题】:What does the following line of a bash script do?bash 脚本的以下行有什么作用?
【发布时间】:2010-04-24 19:29:05
【问题描述】:

通常在 Windows 中工作,但尝试在我的 Mac 上设置 RabbitMQ。有人可以告诉我下面的行是做什么的吗?

[ "x" = "x$RABBITMQ_NODE_IP_ADDRESS" ] && [ "x" != "x$NODE_IP_ADDRESS" ] && RABBITMQ_NODE_IP_ADDRESS=${NODE_IP_ADDRESS}

具体来说,我对[ "x" = "x$RAB..."] 语法很好奇。

【问题讨论】:

    标签: bash rabbitmq


    【解决方案1】:

    如果 RABBITMQ_NODE_IP_ADDRESS 变量为空/不存在,它将评估为 "x" = "x" ,这是真的。

    所以它基本上说,如果没有设置 RABBITMQ_NODE_IP_ADDRESS 并且设置了 NODE_IP_ADDRESS,设置 RABBITMQ_NODE_IP_ADDRESS=NODE_IP_ADDRESS

    【讨论】:

      【解决方案2】:

      如果变量为空或未设置,则使用“x”(有点迷信*)来防止错误。大多数时候,报价会为您解决这个问题。在变量包含以破折号开头的字符串的情况下,通过将文字放在第一位,变量放在第二位,您可以消除错误,因为test(又名[)会认为它是一个运算符。在您的示例中,最好使用 -z-n 运算符分别测试变量是否为空(null 或 unset)或不为空。

      POSIX shell,例如 Bourne(也适用于 Bash):

      [ -z $RABBITMQ_NODE_IP_ADDRESS ] && [ -n $NODE_IP_ADDRESS" ] && RABBITMQ_NODE_IP_ADDRESS=${NODE_IP_ADDRESS}
      

      Bash(以及 kshzsh):

      [[ -z $RABBITMQ_NODE_IP_ADDRESS && -n $NODE_IP_ADDRESS" ]] && RABBITMQ_NODE_IP_ADDRESS=${NODE_IP_ADDRESS}
      

      * 可能有些 shell 需要“x”,但有些人会这样做,“因为一直都是这样”。

      【讨论】:

        【解决方案3】:

        “x”并不总是迷信的,即使在我相对较新的 bash (4.0.33) 中也是如此。

        让我们把操作放在括号之间。空变量很好:

        $ a=""
        $ b=""
        $ if [ '(' "$a" = "$b" ')' ]; then echo both_equal; fi
        both_equal
        

        ! 运算符不是:

        $ a='!'
        $ if [ '(' "$a" = "$b" ')' ]; then echo both_equal; fi
        bash: [: `)' expected, found
        

        如果我们写"x$a" = "x$b"而不是"$a" = "$b",这不是问题。

        【讨论】:

          【解决方案4】:

          括号[test 运算符,您可以将其视为if 语句。这是检查 shell 变量 RABBITMQ_NODE_IP_ADDRESS 是否为空。不幸的是,如果您尝试与空字符串"" 进行比较,shell 会在进行测试之前将其消除,并且您的二进制比较运算符只会得到一个(或可能为零)操作数。为防止该错误,通常的做法是在= 的每一侧连接一个“x”。因此,而不是

          [ "" = "<variable>" ]
          

          成为 [=价值] 并产生错误,

          [ "X" = "X<variable>" ]
          

          变成 [ X = X 值 ]

          比较可能会继续

          【讨论】:

            猜你喜欢
            • 2014-01-18
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-07-04
            • 1970-01-01
            相关资源
            最近更新 更多