通常在 Windows 中工作,但尝试在我的 Mac 上设置 RabbitMQ。有人可以让我知道下面的行是做什么的吗?
[ "x" = "x$RABBITMQ_NODE_IP_ADDRESS" ] && [ "x" != "x$NODE_IP_ADDRESS" ] && RABBITMQ_NODE_IP_ADDRESS=${NODE_IP_ADDRESS}
具体来说,我对[ "x" = "x$RAB..."]
语法很好奇。
如果 RABBITMQ_NODE_IP_ADDRESS 变量为空/不存在,它将评估为 "x" = "x" ,这是真的。
所以它基本上说,如果没有设置 RABBITMQ_NODE_IP_ADDRESS 并且设置了 NODE_IP_ADDRESS,设置 RABBITMQ_NODE_IP_ADDRESS=NODE_IP_ADDRESS
如果变量为空或未设置,则使用“x”(有点迷信*)来防止错误。大多数时候,报价会为您解决这个问题。通过将文字放在第一位,变量放在第二位,您可以消除变量包含以破折号开头的字符串的情况下的错误,因为test
(aka [
) 会认为它是一个运算符。在您的示例中,最好使用-z
and-n
运算符分别测试变量是否为空(null 或 unset)或不为空。
POSIX shell,例如 Bourne(也适用于 Bash):
[ -z $RABBITMQ_NODE_IP_ADDRESS ] && [ -n $NODE_IP_ADDRESS" ] && RABBITMQ_NODE_IP_ADDRESS=${NODE_IP_ADDRESS}
重击(ksh
和zsh
):
[[ -z $RABBITMQ_NODE_IP_ADDRESS && -n $NODE_IP_ADDRESS" ]] && RABBITMQ_NODE_IP_ADDRESS=${NODE_IP_ADDRESS}
* 可能有一些 shell 需要“x”,但有些人会这样做,“因为它一直是这样做的”。
括号[
是一个test
运算符,您可以将其视为一个 if 语句。这是检查 shell 变量 RABBITMQ_NODE_IP_ADDRESS 是否为空。不幸的是,如果您尝试与空字符串进行比较""
,shell 会在进行测试之前将其消除,并且您的二进制比较运算符只会获得一个(或可能为零)操作数。为防止该错误,通常的做法是在=
. 因此,而不是
[ "" = "<variable>" ]
成为 [ = value ] 并产生错误,
[ "X" = "X<variable>" ]
变为 [ X = Xvalue ]
并且比较可能会继续
“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"
.