1

通常は 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

4 に答える 4

4

RABBITMQ_NODE_IP_ADDRESS 変数が空または存在しない場合、それは "x" = "x" として評価されます。これは true です。

したがって、基本的には、RABBITMQ_NODE_IP_ADDRESS が設定されておらず、NODE_IP_ADDRESS が設定されている場合は、RABBITMQ_NODE_IP_ADDRESS=NODE_IP_ADDRESS を設定します。

于 2010-04-24T19:31:46.357 に答える
2

「x」は、変数がnullまたは未設定の場合にエラーを防ぐために(やや迷信的に*)使用されます。ほとんどの場合、引用符がそれを処理します。リテラルを最初に置き、変数を 2 番目に置くことで、変数にダッシュで始まる文字列が含まれている場合のエラーを排除しtestます[。あなたの例の場合、変数が空(nullまたは未設定)か空でないかをそれぞれテストする-zand演算子を使用することをお勧めします。-n

Bourne などの POSIX シェル (Bash でも動作します):

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

バッシュ(およびkshおよびzsh):

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

* 「x」が必要なシェルもあるかもしれませんが、「これまでずっとそうしてきたから」そうする人もいます。

于 2010-04-24T19:57:02.713 に答える
1

ブラケット[test演算子であり、if ステートメントと考えることができます。これは、シェル変数 RABBITMQ_NODE_IP_ADDRESS が空かどうかを確認しています。残念ながら、空の string と比較しようとすると""、シェルはテストを実行する前にそれを排除し、バイナリ比較演算子は 1 つ (またはゼロ) のオペランドしか取得しません。このエラーを防ぐために、=. したがって、代わりに

[ "" = "<variable>" ]

[ = value ] になってエラーになり、

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

[ X = Xvalue ] になります

そして比較は続くかもしれません

于 2010-04-24T20:03:26.843 に答える
1

私の比較的新しいbash(4.0.33)でも、「x」は必ずしも迷信的ではありません。

操作を括弧で囲んでみましょう。空の変数は問題ありません:

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

于 2010-04-25T11:14:03.317 に答える