2010-04-24 8 views
1

Fonctionne généralement sous Windows, mais en essayant de configurer RabbitMQ sur mon Mac. Quelqu'un peut-il me faire savoir ce que la ligne ci-dessous fait?Que fait la ligne suivante d'un script bash?

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

Spécifiquement, je suis curieux au sujet de la syntaxe [ "x" = "x$RAB..."].

Répondre

4

Si la variable RABBITMQ_NODE_IP_ADDRESS est vide/n'existe pas, elle sera évaluée comme "x" = "x", ce qui est vrai.

Il dit essentiellement, si RABBITMQ_NODE_IP_ADDRESS n'est pas réglé et NODE_IP_ADDRESS est réglé, RABBITMQ_NODE_IP_ADDRESS = NODE_IP_ADDRESS

2

Le « x » est utilisé (un peu superstitieuse *) afin d'éviter des erreurs si la variable est nulle ou hors service. La plupart du temps, les citations prennent soin de cela pour vous. En plaçant le littéral en premier et la variable en second lieu vous éliminez les erreurs dans les cas où la variable contient une chaîne qui commence par un tiret, puisque test (aka [) penserait que c'est un opérateur. Dans le cas de votre exemple, il serait préférable d'utiliser les opérateurs -z et -n qui testent si une variable est vide (nulle ou non définie) ou non vide, respectivement.

coquilles POSIX, comme Bourne (œuvres dans Bash, aussi):

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

Bash (et ksh et zsh):

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

* Il peut y avoir quelques coquilles qui ont besoin du " x ", mais certaines personnes le font" parce que cela a toujours été fait de cette façon ".

1

La tranche [ est un opérateur test, que vous pouvez considérer comme une instruction if. Cela vérifie si la variable shell RABBITMQ_NODE_IP_ADDRESS est vide. Malheureusement, si vous essayez de comparer à une chaîne vide "", le shell l'élimine avant de faire le test et votre opérateur de comparaison binaire n'obtient qu'un (ou peut-être zéro) opérandes. Pour éviter cette erreur, il est courant de concaténer un "x" de chaque côté du =. Ainsi, au lieu de

[ "" = "<variable>" ] 

devenir [= valeur] et qui donne une erreur,

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

devient [X = XValue]

et la comparaison peuvent continuer

1

Le "x" n'est pas toujours superstitieux, même dans mon bash relativement nouveau (4.0.33).

Mettons l'opération entre parenthèses. les variables vides sont très bien:

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

Mais l'opérateur ! par exemple n'est pas:

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

Ce n'est pas un problème si nous écrivons "x$a" = "x$b" au lieu de "$a" = "$b".