通常在Windows中工作,但尝试在我的Mac上设置RabbitMQ。有人能让我知道下面这行是做什么的吗?
[ "x" = "x$RABBITMQ_NODE_IP_ADDRESS" ] && [ "x" != "x$NODE_IP_ADDRESS" ] && RABBITMQ_NODE_IP_ADDRESS=${NODE_IP_ADDRESS}
具体来说,我对[ "x" = "x$RAB..."]
语法感到好奇。
答案 0 :(得分:4)
如果RABBITMQ_NODE_IP_ADDRESS变量为空/不存在,则它将评估为“x”=“x”,这是真的。
所以它基本上说,如果没有设置RABBITMQ_NODE_IP_ADDRESS且设置了NODE_IP_ADDRESS,则设置RABBITMQ_NODE_IP_ADDRESS = NODE_IP_ADDRESS
答案 1 :(得分:2)
如果变量为null或未设置,则使用“x”(有点迷信*)来防止错误。大多数情况下,报价会为您处理。通过将文字放在第一个和第二个变量,可以消除在变量包含以短划线开头的字符串的情况下的错误,因为test
(又名[
)会认为它是一个运算符。对于您的示例,最好使用-z
和-n
运算符分别测试变量是空(空或未设置)还是非空。
POSIX shell,例如Bourne(也适用于Bash):
[ -z $RABBITMQ_NODE_IP_ADDRESS ] && [ -n $NODE_IP_ADDRESS" ] && RABBITMQ_NODE_IP_ADDRESS=${NODE_IP_ADDRESS}
Bash(以及ksh
和zsh
):
[[ -z $RABBITMQ_NODE_IP_ADDRESS && -n $NODE_IP_ADDRESS" ]] && RABBITMQ_NODE_IP_ADDRESS=${NODE_IP_ADDRESS}
*可能有一些shell需要“x”,但是有些人这样做“因为它总是这样做的。”
答案 2 :(得分:1)
括号[
是test
运算符,您可以将其视为if语句。这是检查shell变量RABBITMQ_NODE_IP_ADDRESS是否为空。不幸的是,如果您尝试与空字符串""
进行比较,则shell会在进行测试之前将其消除,并且您的二进制比较运算符仅获取一个(或可能为零)操作数。为了防止该错误,通常的做法是在=
的每一侧连接“x”。因此,而不是
[ "" = "<variable>" ]
成为 [=值] 并产生错误,
[ "X" = "X<variable>" ]
变 [X = Xvalue]
并且比较可以继续
答案 3 :(得分:1)
即使在我相对较新的bash(4.0.33)中,“x”并不总是迷信。
让我们在parens之间进行操作。空变量很好:
$ 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"
,这不是问题。