2010-04-24 58 views
1

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

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

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

回答

4

如果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外壳,如伯恩(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} 

*可能有一些炮弹需要“ x“,但有些人这样做”因为它总是这样做的“。

1

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

[ "" = "<variable>" ] 

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

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

变得 [X = x值]

和该比较可以继续

1

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

让我们在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"这不是一个问题。