2010-05-03 76 views
39

在shell腳本中,[email protected]$*有什麼區別?

哪一個是獲取腳本參數的首選方法?

不同shell解釋器之間是否存在差異?

+0

的可能重複[什麼 「$ @」 和 「$ *」 在bash有何區別?(http://stackoverflow.com/questions/3008695 /在bash之間有什麼區別) – Daenyth 2012-05-08 01:02:13

回答

42

here:當報價參數被打破了正常,如果有空格的

$ @的行爲就像$ *除了。

拿這個腳本,例如(從鏈接的回答):

for var in "[email protected]" 
do 
    echo "$var" 
done 

給出了這樣的:

$ sh test.sh 1 2 '3 4' 
1 
2 
3 4 

現在改變"[email protected]"$*

for var in $* 
do 
    echo "$var" 
done 

而且你得到這個:

$ sh test.sh 1 2 '3 4' 
1 
2 
3 
4 

+11

'「$ *」'有另一個有趣的屬性。每個參數都由值「$ IFS」而不是空格分隔。 – 2010-05-03 23:29:02

+0

解釋替換最終如何擴展(之後的命令是什麼樣的)以及爲什麼導致不同的結果可能是值得的。 – 2010-05-03 23:56:39

1

以$ @每一個參數是一個帶引號的字符串(通過使用Google已答覆中找到)。否則它的行爲相同。

參見:http://tldp.org/LDP/abs/html/internalvariables.html#APPREF

+0

「是引用的字符串」?這意味着使用'「$ @」'首先生成一個帶引號的字符串,然後在決定如何運行下一個命令時,shell解析它。更準確地說,'$ *'完成的字符串連接會被跳過,而'$ *'在未加引號時使用的字符串分割也會被跳過。因此,使用'「$ @」'不僅通常更加正確,而且對於shell來說解釋也更少。 – 2012-05-07 23:01:56

+0

...順便說一句,引用IRC中的'!abs'://irc.freenode.org/#bash - 除非您知道如何過濾掉垃圾,否則應該避免臭名昭着的「高級」Bash腳本指南。它會教你編寫錯誤,而不是腳本。有鑑於此,BashGuide寫成:http://mywiki.wooledge.org/BashGuide – 2012-05-07 23:05:27

7

從我的POV一個關鍵不同的是, 「$ @」 保存參數的原號碼 。這是只有形式。出於這個原因,它是 非常方便的腳本傳遞參數。

例如,如果文件my_script包含:

#!/bin/bash 

main() 
{ 
    echo 'MAIN sees ' $# ' args' 
} 

main $* 
main [email protected] 

main "$*" 
main "[email protected]" 

### end ### 

,我運行它是這樣的:

my_script 'a b c' d e 

我會得到這樣的輸出:

主要看到5個ARGS

MAIN看到5個參數

主要看1個ARGS

主要看3個ARGS

相關問題