2012-09-07 171 views
213

在許多SO問題和bash教程我看到,我可以訪問命令行參數在bash腳本中有兩種方式:

$ ~ >cat testargs.sh 
#!/bin/bash 

echo "you passed me" $* 
echo "you passed me" [email protected] 

導致:

$ ~> bash testargs.sh arg1 arg2 
you passed me arg1 arg2 
you passed me arg1 arg2 

$*[email protected]有什麼區別?
什麼時候應該使用前者,何時使用後者?

+0

看看這個答案:http://stackoverflow.com/a/842325/671366 – codeling

+2

@nyarlathotep,謝謝,這個問題很有用。標題很糟糕。我永遠不會猜測答案顯示我在找什麼。不知何故,我的問題確實很微不足道,但是我在頭腦中制定它的方式在bash手冊中找不到(儘管/ *將您帶到了正確的地方......) – Oz123

回答

286

當特殊參數報價的差異出現。讓我說明的差異:

$ set -- "arg 1" "arg 2" "arg 3" 

$ for word in $*; do echo "$word"; done 
arg 
1 
arg 
2 
arg 
3 

$ for word in [email protected]; do echo "$word"; done 
arg 
1 
arg 
2 
arg 
3 

$ for word in "$*"; do echo "$word"; done 
arg 1 arg 2 arg 3 

$ for word in "[email protected]"; do echo "$word"; done 
arg 1 
arg 2 
arg 3 

一個在引用的重要性進一步例如:注有「ARG」和數字2米之間的空間,但如果我不引用$字:

$ for word in "[email protected]"; do echo $word; done 
arg 1 
arg 2 
arg 3 

,並在bash,"[email protected]"是 「默認」 列表遍歷:

$ for word; do echo "$word"; done 
arg 1 
arg 2 
arg 3 
+37

+1我一直認爲這是概念最好通過一個簡單的例子來演示,其中bash手冊完全沒有。 – chepner

+5

有沒有可能的用例,可能需要'$ *'或'「$ *」',目的不能由'$ @'或'「$ @」'提供? – anishsane

+0

另外,'$ {arrayname [*]}'與'$ {arrayname [@]}'有區別嗎? – anishsane

15

$ @與$ *相同,但每個參數都是帶引號的字符串,也就是說,這些參數是完整傳遞的,沒有解釋或擴展。這意味着,除其他外,參數列表中的每個參數都被視爲一個單獨的單詞。

當然,應該引用「$ @」。

http://tldp.org/LDP/abs/html/internalvariables.html#ARGLIST

33

$ *

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

$ @

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

來源:Bash man

148

一個不錯的哈從Bash Hackers Wiki NDY概覽表:

$* versus $@ table

如果參數存儲在一個腳本變量和論證,預計包含空格,我衷心建議採用"$*" trick with the internal field separator $IFS set to tab

+32

...其中「c」是$ IFS –

+31

的第一個字符,而'$ IFS'則表示「內部字段分隔符」。 –

+0

這裏是[示例](https://stackoverflow.com/a/4824637/2192488),其中包括引用的輸入。輸入也很重要! –