通常は Windows で動作しますが、Mac で RabbitMQ をセットアップしようとしています。誰かが私に下の行が何をするのか教えてもらえますか?
[ "x" = "x$RABBITMQ_NODE_IP_ADDRESS" ] && [ "x" != "x$NODE_IP_ADDRESS" ] && RABBITMQ_NODE_IP_ADDRESS=${NODE_IP_ADDRESS}
[ "x" = "x$RAB..."]
具体的には、構文に興味があります。
RABBITMQ_NODE_IP_ADDRESS 変数が空または存在しない場合、それは "x" = "x" として評価されます。これは true です。
したがって、基本的には、RABBITMQ_NODE_IP_ADDRESS が設定されておらず、NODE_IP_ADDRESS が設定されている場合は、RABBITMQ_NODE_IP_ADDRESS=NODE_IP_ADDRESS を設定します。
「x」は、変数がnullまたは未設定の場合にエラーを防ぐために(やや迷信的に*)使用されます。ほとんどの場合、引用符がそれを処理します。リテラルを最初に置き、変数を 2 番目に置くことで、変数にダッシュで始まる文字列が含まれている場合のエラーを排除しtest
ます[
。あなたの例の場合、変数が空(nullまたは未設定)か空でないかをそれぞれテストする-z
and演算子を使用することをお勧めします。-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」が必要なシェルもあるかもしれませんが、「これまでずっとそうしてきたから」そうする人もいます。
ブラケット[
はtest
演算子であり、if ステートメントと考えることができます。これは、シェル変数 RABBITMQ_NODE_IP_ADDRESS が空かどうかを確認しています。残念ながら、空の string と比較しようとすると""
、シェルはテストを実行する前にそれを排除し、バイナリ比較演算子は 1 つ (またはゼロ) のオペランドしか取得しません。このエラーを防ぐために、=
. したがって、代わりに
[ "" = "<variable>" ]
[ = value ] になってエラーになり、
[ "X" = "X<variable>" ]
[ X = Xvalue ] になります
そして比較は続くかもしれません
私の比較的新しい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"
。