2015-12-06 55 views
0

我正在讀的源代碼,並發現這些行:linux shell - 奇怪'如果'?

if [ -n "${INIT_NAMENODE+1}" ] 
then 
    echo "Initializing namenode" 
else 
    echo "Starting namenode" 
fi 

我應該怎麼interpred的 '如果' 條件:如果[-n 「$ {INIT_NAMENODE + 1}」]? ?

+0

你認爲哪一點很奇怪? – John3136

+0

這裏有一篇相關文章http://unix.stackexchange.com/a/99186 –

+0

euh ....整個條件... [-n]在這裏做什麼?這裏的[+1]是什麼?我是Linux shell的新手,我不得不說...這裏的[「」] usefule是什麼? –

回答

1

這段代碼的好處在於它不是爲「Linux shell」編寫的。它是爲更一般的「UNIX外殼」類別編寫的。至少從V7 UNIX(1979)開始,它將一切工作。可移植性較低的人可能會在沒有-n的情況下編寫它。

第一個感興趣的項目是${foo+bar}語法。這是foo參數存在的測試。如果$foo存在,則${foo+bar}等於bar。如果$foo不存在,則${foo+bar}等於空字符串。

如果您在shell手冊頁中查找此文件,通常會將其記錄爲${foo:+bar}以及其他一些相關表單,如${foo:-bar},並且附近有一個註釋說明可以省略冒號,從而導致稍微不同的行爲(使用冒號,值爲空字符串的變量被視爲與不存在的變量相同)。

接下來我們有[ -n ... ]測試。 -n測試以下字符串爲空。如果字符串爲非空,則成功。從上一段我們知道${INIT_NAMENODE+1}是空的當且僅當$INIT_NAMENODE不存在。所以-n測試成功,如果$INIT_NAMENODE存在。值1在這裏並不重要 - 如果將1更改爲20teapot,它也會執行相同的操作。重要的是它不是一個空字符串,因爲-n不關心其餘的。

嘗試從你的shell提示符中得到一些例子:echo ${PATH+hello}應該說hello,因爲你確實有一個$PATH變量。 echo ${asdfghjkl+hello}應該打印一個空行。

所以,在if聲明的情況下,測試的目的是做的第一echo如果變量$INIT_NAMENODE存在,而第二echo如果變量$INIT_NAMENODE不存在。