2012-04-03 9 views
72

एक शेल स्क्रिप्ट में एक साइन-इन (@) के बाद डॉलर का चिह्न क्या होता है?

उदाहरण के लिए:

umbrella_corp_options [email protected] 
+4

की [क्या है $ @ या बैश में $ @ की एक explaination के लिए खोज] (संभव डुप्लिकेट http://stackoverflow.com/प्रश्न/38 9 8665/क्या-है-या-खोज-के-व्याख्या-के-इन-बश) – l0b0

उत्तर

106

[email protected]मापदंडों स्क्रिप्ट के लिए पारित के सभी है।

उदाहरण के लिए, यदि आप ./someScript.sh foo bar पर कॉल करते हैं तो [email protected]foo bar के बराबर होगा।

यदि आप करते हैं:

./someScript.sh foo bar 

और फिर someScript.sh संदर्भ के अंदर:

umbrella_corp_options "[email protected]" 

इस प्रत्येक व्यक्ति डबल उद्धरण में संलग्न पैरामीटर के साथ umbrella_corp_options को दे दिया जाएगा, रिक्त स्थान के साथ मापदंडों लेने की अनुमति कॉलर से और उन्हें पास करें।

+0

STATUS_ACCESS_DEN ... फैंसी संपादन धन्यवाद! – Har

+0

$ @ क्या होगा यदि मैंने कुछ scriptScript.sh foo bar "बू दूर" किया था? – trusktr

+0

http://teaching.idallen.com/dat2330/04f/notes/shell_variables.txt इसे देखें। – Har

5

From the manual:

@

स्थितीय मापदंडों के विस्तार, एक से शुरू। जब विस्तार डबल कोट्स के भीतर होता है, तो प्रत्येक पैरामीटर एक अलग शब्द तक फैलता है। यही है, "$ @" "$ 1" "$ 2" के बराबर है .... यदि डबल-उद्धृत विस्तार किसी शब्द के भीतर होता है, तो पहले पैरामीटर का विस्तार मूल शब्द के प्रारंभिक भाग से जुड़ जाता है, और अंतिम पैरामीटर का विस्तार मूल शब्द के अंतिम भाग में शामिल हो गया है। जब कोई स्थितित्मक पैरामीटर नहीं होते हैं, तो "$ @" और $ @ कुछ भी नहीं बढ़ते हैं (यानी, उन्हें हटा दिया जाता है)।

8

ज्यादातर मामलों में एक शुद्ध [email protected] साधन के उपयोग के "के रूप में आप कर सकते हैं मुश्किल के रूप में प्रोग्रामर चोट", क्योंकि ज्यादातर मामलों में यह शब्द जुदाई के साथ और रिक्त स्थान और बहस में अन्य पात्रों के साथ समस्याओं को जन्म देता।

सभी मामलों में 99% (अनुमानित) में, इसे ": "[email protected]" में संलग्न करने की आवश्यकता है, जो कि तर्कों पर भरोसेमंद रूप से पुनरावृत्ति के लिए उपयोग किया जा सकता है।

for a in "[email protected]"; do something_with "$a"; done 
+4

के बीच मुख्य अंतर देता है आपकी लाइन के रूप में लिखा जा सकता है: एक के लिए; कुछ "$ ए" के साथ कुछ करें; किया ;-) – Alfe

+1

@ एल्फ मुझे पता है; मैं बस इसे भूल गया है। इसे 'start_token में एक के लिए' $ @ "end_token के रूप में सोचें; कुछ "$ ए" के साथ कुछ करें; किया गया' :-) – glglgl

54

[email protected] लगभग $* के रूप में ही दोनों जिसका अर्थ है "सभी आदेश पंक्ति तर्क" है। वे अक्सर किसी अन्य कार्यक्रम में सभी तर्कों को पारित करने के लिए उपयोग किए जाते हैं (इस प्रकार उस अन्य कार्यक्रम के चारों ओर एक रैपर बनाते हैं)।

दो वाक्यविन्यासों के बीच का अंतर तब दिखाई देता है जब आपके पास रिक्त स्थान के साथ तर्क होता है (उदा।) और दोहरे उद्धरण में [email protected] डाल:

wrappedProgram "[email protected]" 
# ^^^ this is correct and will hand over all arguments in the way 
#  we received them, i. e. as several arguments, each of them 
#  containing all the spaces and other uglinesses they have. 
wrappedProgram "$*" 
# ^^^ this will hand over exactly one argument, containing all 
#  original arguments, separated by single spaces. 
wrappedProgram $* 
# ^^^ this will join all arguments by single spaces as well and 
#  will then split the string as the shell does on the command 
#  line, thus it will split an argument containing spaces into 
#  several arguments. 

उदाहरण: कॉलिंग

wrapper "one two three" four five "six seven" 

में परिणाम होगा:

"[email protected]": wrappedProgram "one two three" four five "six seven" 
"$*": wrappedProgram "one two three four five six seven" 
$*: wrappedProgram one two three four five six seven 
+1

वे * समान नहीं हैं, और मैनफ़ोन IFS का उपयोग करके $ * के दुष्प्रभावों पर स्पष्ट है-जो आवश्यक स्थान नहीं है। (यदि वे वही थे, तो दोनों की पेशकश में संगतता के अलावा, कोई भी बिंदु नहीं होगा।) –

+5

नहीं वे नहीं हैं। और मैंने नीचे दो पंक्तियों को कहा: "दोनों के बीच का अंतर ..." छोटे वाक्यों को पाने और पठनीयता बढ़ाने के लिए पाठक को निर्णय देने से पहले एक से अधिक वाक्य पढ़ना पड़ता है: -/ – Alfe

+1

अल्फे, क्रिस्टोफर का उस सम्मिलन एक शब्द "लगभग" किसी भी अंतर या पठनीयता को बलि किए बिना, एक अंतर का नरक बना दिया। असल में मैंने इस जवाब को उठाया (स्वीकार्य एक के विपरीत) * अंतर * के उस सूक्ष्म जोर के कारण ... - यह समझने से पहले कि यह लगभग आपकी इच्छा के विरुद्ध था! ;) –

13

ये आदेश पंक्ति तर्क हैं जहां:

[email protected] = स्ट्रिंग
की सूची में सभी तर्कों को संग्रहीत करता है $* = भंडार एक एकल स्ट्रिंग
$# के रूप में सभी तर्कों = भंडार तर्क की संख्या

+1

आपके पास '$ @' और '$ *' पीछे की ओर है – iruvar