2012-08-22 94 views
2

我不太清楚怎麼去理解這個 -

$ var=' ' 
$ echo "|${var}|" 
| | 
$ echo "|${var// /}|" 
|| 

比。

$ set -- '' '' '' 
$ echo "|${*}|" 
| | 
$ echo "|${*// /}|" 
| | 

然而,當我上面的

$ IFS= 
$echo "|${*// /}|" 
|| 

什麼是在第二組命令中出現問題後添加此?這是預期的結果嗎?

+3

沒什麼。是的。 –

回答

4

例1

$ var=' ' 
$ echo "|${var}|" 
| | 
$ echo "|${var// /}|" 
|| 

這裏有由兩個空間的簡單的字符串。在兩個管道字符之間展開時,會在管道之間看到兩個空格。當您使用模式替換從變量的擴展中刪除所有空格時,您會看到兩個管道之間的空字符串。

實施例2

$ set -- '' '' '' 

首先,你每個前三個位置參數的設置爲空字符串。您可以通過比較${1-foo}{$4-foo}(顯示參數(如果設置),但'foo'(如果未設置))的結果來觀察這一點。

$ echo ${1-foo} 

$ echo ${4-foo} 
foo 

所以我們可以看到,$1設置,但空,而$4未設置。

$ echo "|${*}|" 
| | 

接下來,我們看擴大引號內的特殊參數$*,這是由所設置的位置參數,由參數IFS的第一個字符分隔的一個字符串的結果。 IFS默認情況下有一個空格作爲其第一個參數,所以我們看到的是一個由3個空字符串組成的字符串,每個空字符串之間用空格隔開,它們只是一個由2個空格組成的單個字符串。

$ echo "|${*// /}|" 
| | 

當應用模式替換到$*,取代被施加到所得到的參數是使用IFS接合之前單獨每個位置參數。由於位置參數已經爲空,因此從它們移除空格會使其不變。所以你得到的結果與你自己擴展$*的結果相同。

實施例3

$ IFS= 
$ echo "|${*// /}|" 
|| 

這裏的程序是相同的實施例2中,與現在IFS是空字符串,而不是它的「」默認的重要區別。再一次,模式替換並沒有做任何事情,因爲沒有空間可以從任何位置參數中移除。但是現在,擴展$*會生成一個由位置參數組成的字符串,而不包含中間字符。而不是$1 $2 $3,你得到$1$2$3。由於所有三個都是空字符串,結果是空字符串。

+0

謝謝。這解釋了很多。 – Annjawn