我正在讀的源代碼,並發現這些行:linux shell - 奇怪'如果'?
if [ -n "${INIT_NAMENODE+1}" ]
then
echo "Initializing namenode"
else
echo "Starting namenode"
fi
我應該怎麼interpred的 '如果' 條件:如果[-n 「$ {INIT_NAMENODE + 1}」]? ?
我正在讀的源代碼,並發現這些行:linux shell - 奇怪'如果'?
if [ -n "${INIT_NAMENODE+1}" ]
then
echo "Initializing namenode"
else
echo "Starting namenode"
fi
我應該怎麼interpred的 '如果' 條件:如果[-n 「$ {INIT_NAMENODE + 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
更改爲2
或0
或teapot
,它也會執行相同的操作。重要的是它不是一個空字符串,因爲-n
不關心其餘的。
嘗試從你的shell提示符中得到一些例子:echo ${PATH+hello}
應該說hello
,因爲你確實有一個$PATH
變量。 echo ${asdfghjkl+hello}
應該打印一個空行。
所以,在if
聲明的情況下,測試的目的是做的第一echo
如果變量$INIT_NAMENODE
存在,而第二echo
如果變量$INIT_NAMENODE
不存在。
你認爲哪一點很奇怪? – John3136
這裏有一篇相關文章http://unix.stackexchange.com/a/99186 –
euh ....整個條件... [-n]在這裏做什麼?這裏的[+1]是什麼?我是Linux shell的新手,我不得不說...這裏的[「」] usefule是什麼? –