我不太清楚怎麼去理解這個 -
$ var=' '
$ echo "|${var}|"
| |
$ echo "|${var// /}|"
||
比。
$ set -- '' '' ''
$ echo "|${*}|"
| |
$ echo "|${*// /}|"
| |
然而,當我上面的
$ IFS=
$echo "|${*// /}|"
||
什麼是在第二組命令中出現問題後添加此?這是預期的結果嗎?
我不太清楚怎麼去理解這個 -
$ var=' '
$ echo "|${var}|"
| |
$ echo "|${var// /}|"
||
比。
$ set -- '' '' ''
$ echo "|${*}|"
| |
$ echo "|${*// /}|"
| |
然而,當我上面的
$ IFS=
$echo "|${*// /}|"
||
什麼是在第二組命令中出現問題後添加此?這是預期的結果嗎?
$ var=' '
$ echo "|${var}|"
| |
$ echo "|${var// /}|"
||
這裏有由兩個空間的簡單的字符串。在兩個管道字符之間展開時,會在管道之間看到兩個空格。當您使用模式替換從變量的擴展中刪除所有空格時,您會看到兩個管道之間的空字符串。
$ set -- '' '' ''
首先,你每個前三個位置參數的設置爲空字符串。您可以通過比較${1-foo}
與{$4-foo}
(顯示參數(如果設置),但'foo'(如果未設置))的結果來觀察這一點。
$ echo ${1-foo}
$ echo ${4-foo}
foo
所以我們可以看到,$1
設置,但空,而$4
未設置。
$ echo "|${*}|"
| |
接下來,我們看擴大引號內的特殊參數$*
,這是由所設置的位置參數,由參數IFS
的第一個字符分隔的一個字符串的結果。 IFS
默認情況下有一個空格作爲其第一個參數,所以我們看到的是一個由3個空字符串組成的字符串,每個空字符串之間用空格隔開,它們只是一個由2個空格組成的單個字符串。
$ echo "|${*// /}|"
| |
當應用模式替換到$*
,取代被施加到所得到的參數是使用IFS
接合之前單獨每個位置參數。由於位置參數已經爲空,因此從它們移除空格會使其不變。所以你得到的結果與你自己擴展$*
的結果相同。
$ IFS=
$ echo "|${*// /}|"
||
這裏的程序是相同的實施例2中,與現在IFS
是空字符串,而不是它的「」默認的重要區別。再一次,模式替換並沒有做任何事情,因爲沒有空間可以從任何位置參數中移除。但是現在,擴展$*
會生成一個由位置參數組成的字符串,而不包含中間字符。而不是$1 $2 $3
,你得到$1$2$3
。由於所有三個都是空字符串,結果是空字符串。
謝謝。這解釋了很多。 – Annjawn
沒什麼。是的。 –