1

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

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

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

4

4 回答 4

4

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

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

于 2010-04-24T19:31:46.357 回答
2

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

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

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

重击(kshzsh):

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

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

于 2010-04-24T19:57:02.713 回答
1

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

[ "" = "<variable>" ]

成为 [ = value ] 并产生错误,

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

变为 [ X = Xvalue ]

并且比较可能会继续

于 2010-04-24T20:03:26.843 回答
1

“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".

于 2010-04-25T11:14:03.317 回答