2015-01-06 71 views
4

甚至發生根據http://tldp.org/LDP/abs/html/quotingvar.html詞的拆分用雙引號

使用雙引號來防止分詞。 用雙引號括起來的參數表現爲一個單詞,即使它包含空白分隔符,它也是 。

不過,我有

0> /bin/bash --version 
GNU bash, version 4.3.11(1)-release (x86_64-pc-linux-gnu) 
[...] 

1> cat inspect.sh 
#!/bin/bash 
echo "first argument is $1" 
echo "second argument is $2" 

2> cat test.sh 
#!/bin/bash 
set -x 
./inspect.sh "hello [email protected]" 

3> ./test.sh alice bob 
+ ./inspect.sh 'hello alice' bob 
first argument is hello alice 
second argument is bob 

4> ./test.sh "alice bob" 
+ ./inspect.sh 'hello alice bob' 
first argument is hello alice bob 
second argument is 

我不知道爲什麼3> 4>有不同的結果?如何修改test.sh讓3>具有與4>相同的輸出?

回答

7

答案是[email protected]是特殊的。

Bash Reference Manual3.4.2 Special Parameters

@

展開爲位置參數,從1開始。當擴展出現在雙引號內時,每個 參數將擴展爲單獨的單詞 。也就是說,「$ @」相當於「$ 1」「$ 2」...。如果 雙引號擴展出現在單詞中,則將 第一個參數的擴展連接到原始單詞 的開頭部分,並將最後一個參數的擴展連接到原始單詞的最後一個 部分。當沒有位置參數時, 「$ @」和$ @展開爲空(即,它們被移除)。

具體來說:

  • 當擴展雙引號內發生,每個參數擴展爲一個單獨的字。

  • 如果一個字內出現雙引號的擴展,第一個參數的擴展加入了與原詞的開頭部分,並在最後一個參數的擴張加盟與原詞的最後部分。

相結合可以讓你"hello "合併的第一個參數和""合併到最終的說法,但每個參數擴展到了自己的話。

如果您想將所有參數展開爲一個單詞,那麼您想使用$*

*

展開爲位置參數,從1開始。當擴展出現在雙引號內時,它將 擴展爲單個字 ,每個參數的值由IFS特殊變量的第一個字符分隔。也就是說,「$ *」相當於「$ 1c $ 2c ...」, 其中c是IFS變量值的第一個字符。如果 IFS未設置,則參數由空格分隔。如果IFS爲空,則 參數在不插入分隔符的情況下連接。

+1

爲了進一步說明,試試這個:'set - 「ted carol」「alice bob」; printf「%s \ n」「hello $ @ world」' –