2016-02-27 49 views
2

bash腳本的新手。在bash腳本的開始變量初始化

silent_install=true 

然後這個變量在以下2種方式使用腳本

if [ -z "$silent_install" ]; then 

if [ -z ${silent_install} ]; then 

的區別是什麼2種用法之間?

回答

7

短:第二個是錯的。

錯誤,因爲未加引號的變量將是分詞的主題。如果變量包含空格,則測試將失敗。

{}沒有什麼區別,您可以使用它們或不使用引號或引號。但是,通常我會建議使用它們。特別是如果你插入他們像"$foo_bar"。這裏的變量名稱是什麼? "${foo}_bar"更清潔。

我將因此使用:

if [ -z "${silent_install}" ] ; then 
+0

呃,錯誤*除非*您使用[[]]',否? – DevSolar

+1

@DevSolar你說得對。 (我沒有在我的答案中加入以保持清楚。)由於擴展測試'[[]]'是bash語法特性而不是外部命令(或內置命令),因此在這種情況下不會發生分詞。 – hek2mgl

+2

@DevSolar實際上,在某些情況下,雙引號即使在'[[]]'中也很重要,比如字符串比較的右側。國際海事組織在任何地方都進行雙引號比試圖追蹤它在哪裏以及它們可以安全離開的地方更容易。 –

2

您應該使用雙引號使其爲一個字符串。值true您將看不到任何區別,但silent_install具有特殊字符或空格時會遇到問題(silent_install="I do not know")。
開始習慣{}。他們在這裏並不重要,但是當你在其後面有其他字符時($SILENT_INSTALLandmore),這很重要。
大寫字符被保留用於慶典,所以使用if [ -z "${silent_install}" ]

2

除了與分詞其他答案指出存在的問題,有一個與[ -z ${silent_install} ]另一個問題。在其中一個預期情況下,其中silent_install未設置或空白,則測試命令擴展爲[ -z ]。當[命令只用一個參數獲取表達式時,它會測試該參數以查看它是否非空白。在這種情況下,「-z」不是空白,所以測試返回true。這是預期的結果,但這只是一個巧合;它實際上正在測試與腳本作者認爲它非常不同的東西。

此腳本編寫問題的更嚴重變體是反向測試,[ -n ${somevar} ]-n表示「不是空白」,與-z相反)。因爲[ -n ]實際上測試-n是否非空白,它會返回true,這與您所期望的相反。

故事的寓意是「雙引號變量引用!」它可以防止各種奇怪的錯誤和意外行爲。