2010-04-24 61 views
1

通常在Windows中工作,但試圖在我的Mac上設置RabbitMQ。有人能讓我知道下面的行是什麼嗎?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(又名[)會認爲它是一個操作符。在你的例子中,最好使用-z-n運算符分別測試一個變量是空的(null還是unset)還是不爲空。

POSIX外殼,如伯恩(Bash中的作品,太):

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

擊(和kshzsh):

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

*可能有一些炮彈需要「 x「,但有些人這樣做」因爲它總是這樣做的「。

1

括號[是一個test運算符,您可以將其視爲if語句。這是檢查是否shell變量RABBITMQ_NODE_IP_ADDRESS是空的。不幸的是,如果您嘗試與空字符串""進行比較,那麼在執行測試之前,shell會將其清除,而您的二進制比較運算符只會獲得一個(或可能爲零)操作數。爲防止出現這種錯誤,在=的每一側連接一個「x」是一種常見的做法。因此,代替

[ "" = "<variable>" ] 

成爲 [=值] 併產生一個錯誤,

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

變得 [X = x值]

和該比較可以繼續

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"這不是一個問題。