bash脚本的以下行是做什么的?

时间:2010-04-24 19:29:06

标签: bash rabbitmq

通常在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 个答案:

答案 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(以及kshzsh):

[[ -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",这不是问题。