2010-04-24 4 views
1

Обычно работает в Windows, но пытается настроить RabbitMQ на моем Mac. Может ли кто-нибудь сообщить мне, что делает строка ниже?Что делает следующая строка сценария 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 (aka [) будет считать, что это оператор. В случае вашего примера было бы предпочтительнее использовать операторы -z и -n, которые проверяют, является ли переменная пустой (нулевой или не заданной) или не пустой, соответственно.

POSIX оболочки, такие как 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} 

* Там могут быть некоторые оболочки, которые нуждаются в " x ", но некоторые люди делают это", потому что это всегда было сделано именно так ".

1

Кронштейн [ является оператором test, который вы можете рассматривать как инструкцию if. Это проверяет, пуста ли переменная оболочки RABBITMQ_NODE_IP_ADDRESS. К сожалению, если вы попытаетесь сравнить с пустой строкой "", оболочка устранит ее, прежде чем она проведет тест, а ваш оператор бинарного сравнения получит только один (или нулевой) операнд. Чтобы предотвратить эту ошибку, распространенной практикой является объединение «x» на каждой стороне =. Таким образом, вместо того, чтобы

[ "" = "<variable>" ] 

становятся [= значение] и получая ошибку,

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

становится [Х = Xvalue]

и сравнение может продолжаться

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".

Смежные вопросы