tags:

views:

76

answers:

4

Usually work in Windows, but trying to setup RabbitMQ on my Mac. Can someone let me know what the line below does?

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

Specifically, I'm curious about the [ "x" = "x$RAB..."] syntax.

+4  A: 

If the RABBITMQ_NODE_IP_ADDRESS variable is empty/doesn't exist, it'll evaluate as "x" = "x" , which is true.

So it basically says, if RABBITMQ_NODE_IP_ADDRESS isn't set and NODE_IP_ADDRESS is set, set RABBITMQ_NODE_IP_ADDRESS=NODE_IP_ADDRESS

nos
+2  A: 

The "x" is used (somewhat superstitiously*) to prevent errors if the variable is null or unset. Most of the time the quotes take care of that for you. By putting the literal first and the variable second you eliminate errors in cases where the variable contains a string that starts with a dash, since test (aka [) would think it is an operator. In the case of your example, it would be preferable to use the -z and -n operators that test whether a variable is empty (null or unset) or not empty, respectively.

POSIX shells, such as Bourne (works in Bash, too):

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

Bash (and ksh and zsh):

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

* There may be some shells that need the "x", but some people do that "because it's always been done that way".

Dennis Williamson
+1  A: 

The bracket [ is a test operator, which you can think of as an if statement. This is checking to see if the shell variable RABBITMQ_NODE_IP_ADDRESS is empty. Unfortunately, if you try to compare to an empty string "", the shell eliminates it before it does the test and your binary comparison operator only gets one (or maybe zero) operands. To prevent that error, it is a common practice to concatenate an "x" on each side of the =. Thus, instead of

[ "" = "<variable>" ]

becoming [ = value ] and yielding an error,

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

becomes [ X = Xvalue ]

and the comparison may continue

mpez0
+1  A: 

The "x" is not always superstitious, even in my relatively new bash (4.0.33).

Let's put the operation between parens. Empty variables are fine:

$ a=""
$ b=""
$ if [ '(' "$a" = "$b" ')' ]; then echo both_equal; fi
both_equal

But the ! operator for instance is not:

$ a='!'
$ if [ '(' "$a" = "$b" ')' ]; then echo both_equal; fi
bash: [: `)' expected, found

This is not a problem if we write "x$a" = "x$b" instead of "$a" = "$b".

hcs42