2010-05-03 15 views
39

शैल स्क्रिप्ट में, [email protected] और $* के बीच क्या अंतर है?

स्क्रिप्ट तर्क प्राप्त करने के लिए कौन सा पसंदीदा तरीका है?

क्या इस बारे में विभिन्न शैल दुभाषियों के बीच अंतर है?

+0

के संभावित डुप्लिकेट [क्या के बीच "$ @" और "$ *" बैश में? अंतर] (http://stackoverflow.com/questions/3008695 देखता है/क्या-अंतर-बीच-बीच-में-बाश) – Daenyth

उत्तर

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' मान से अलग किया जाता है। –

+0

यह समझाने के लिए सार्थक हो सकता है कि प्रतिस्थापन कैसे विस्तारित होते हैं (आदेश क्या बाद में दिखते हैं) और इसके परिणामस्वरूप अलग-अलग परिणाम क्यों होते हैं। –

1

$ के साथ @ प्रत्येक पैरामीटर एक उद्धृत स्ट्रिंग है (Google का उपयोग करके पाया उत्तर)। अन्यथा यह वही व्यवहार करता है।

देखें: http://tldp.org/LDP/abs/html/internalvariables.html#APPREF

+0

"क्या उद्धृत स्ट्रिंग है"?इसका तात्पर्य है कि '$ @" का उपयोग करके पहले उद्धृत स्ट्रिंग उत्पन्न होता है, और उसके बाद खोल तब यह तय करता है कि अगली कमांड को कैसे चलाया जाए। यह कहना अधिक सटीक होगा कि '$ *' द्वारा किए गए स्ट्रिंग कॉन्सटेनेशन को छोड़ दिया गया है, जैसा स्ट्रिंग-स्प्लिटिंग किया जाता है जब '$ *' का उपयोग अनिश्चित होता है। इस प्रकार, '$ @" का उपयोग न केवल आम तौर पर अधिक सही है, बल्कि शैल के व्याख्या के लिए भी कम काम है। –

+0

... वैसे, आईआरसी में '! Abs' उद्धृत करने के लिए: //irc.freenode.org/#bash - कुख्यात" उन्नत "बैश स्क्रिप्टिंग गाइड से बचा जाना चाहिए जबतक कि आप जंक को फ़िल्टर करने के बारे में नहीं जानते। यह आपको बग लिखने के लिए सिखाएगा, स्क्रिप्ट नहीं। उस प्रकाश में, बैशगुइड लिखा गया था: http://mywiki.wooledge.org/BashGuide –

7

एक कुंजी मेरी पीओवी से अंतर यह है कि "$ @" बहस के मूल संख्या को बरकरार रखता है है। यह केवल रूप है जो करता है। इसी कारण से यह स्क्रिप्ट के साथ तर्क पारित करने के लिए बहुत आसान है।

उदाहरण के लिए, फ़ाइल 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 आर्ग

देखता है

मुख्य 5 तर्क

देखता है

मुख्य 1 आर्ग

मुख्य देखता 3 आर्ग

संबंधित मुद्दे