2012-03-28 21 views
20

संभव डुप्लिकेट के बीच अंतर:
What the difference between “[email protected]” and “$*” in bash?

सालों के लिए और अवसरों के दर्जनों पर, मैं शेल स्क्रिप्ट में $* और [email protected] के उपयोग के बीच झिझक है । बैश के मैनपेज के लागू खंड को बार-बार पढ़ने के बाद, $* और [email protected] दोनों की कोशिश करने के बाद, मैं दो चर के बीच अनुप्रयोग के व्यावहारिक अंतर को समझने में पूरी तरह विफल हूं। क्या आप मुझे प्रबुद्ध कर सकते हैं, कृपया?

मैं हाल ही में $* का उपयोग कर रहा हूं, लेकिन मुझसे पूछें क्यों नहीं। मुझे नहीं पता क्यों, क्योंकि मुझे नहीं पता कि [email protected] क्यों मौजूद है, $* के लिए लगभग सटीक समानार्थी के रूप में।

क्या कोई व्यावहारिक अंतर है?

(।। मैं व्यक्तिगत रूप से बैश का प्रयोग करते हैं, लेकिन खोल के चुनाव के बारे में नास्तिक रहने मेरा प्रश्न के रूप में तक मुझे पता है बैश के लिए विशिष्ट नहीं है)

+1

सिंबलहाउंड पर [$ * $ @] (http://symbolhound.com/?q=%24%40+%24*) के लिए खोज करना कई डुप्लिकेट पाता है। हाथी उपकरण, वह। –

+1

(उदाहरण के लिए, उदाहरण के लिए, http://stackoverflow.com/questions/3307672/whats-the-difference-between-and-in-unix, http://stackoverflow.com/questions/2761723/what-is-the -डिफरेंस-बीच-इन-इन-शेल-स्क्रिप्ट्स, http://stackoverflow.com/questions/4491115/what-is-the-internal-processing-of-and।) –

+0

@ChrisMorgan: सभी बिंदुओं पर पुष्टि की गई। सिंबलहाउंड आसान दिखता है। मुझे इसके बारे में पता नहीं था। अगली बार, मैं पहले वहां खोज करूंगा। क्या मुझे आपके प्रश्न का सुझाव देने के लिए कुछ कदम उठाना चाहिए? – thb

उत्तर

46

अनजान, कोई फर्क नहीं पड़ता - वे सभी तर्कों में विस्तारित होते हैं और वे तदनुसार विभाजित होते हैं। उद्धरण देते समय अंतर आता है। "[email protected]" उचित ढंग से उद्धृत तर्कों का विस्तार करता है और "$*" सभी तर्कों को एक ही तर्क में बनाता है। उदाहरण के लिए यह लो:

#!/bin/bash 

function print_args_at { 
    printf "%s\n" "[email protected]" 
} 

function print_args_star { 
    printf "%s\n" "$*" 
} 

print_args_at "one" "two three" "four" 
print_args_star "one" "two three" "four" 

तब:

$ ./printf.sh 

one 
two three 
four 

one two three four 
5

पर विचार करें:

foo() { mv "[email protected]"; } 
bar() { mv "$*"; } 
foo a b 
bar a b 

कॉल foo करने के लिए एक बी बी फ़ाइल करने का प्रयास करेंगे। कॉल टू बार विफल हो जाएगा क्योंकि यह केवल एक तर्क के साथ एमवी को कॉल करता है।

+0

धन्यवाद। * $ @ * और * $ \ ** तो समान हैं यदि उद्धरण चिह्नों के बिना उपयोग किया जाता है? – thb

+3

उद्धरण के बिना, $ @ और $ * समान हैं। –

+2

इसके अलावा, कुछ टूटे हुए गोले ''$ @" पर खाली रिक्त स्थान तक विस्तार होता है, "यदि कोई भी स्थितित्मक पैरामीटर नहीं है, तो सही तरीके से विस्तार करने के बजाय।तो इस चाल का उपयोग किया जाना चाहिए: '$ {@ +" $ @ "}' (यदि '$ @' nonblank है, तो विकल्प "$ @" और कुछ भी नहीं)। यदि आप इसे कभी देखते हैं, तो आपको पता चलेगा क्यों। – Kaz

4

भी ध्यान रखें कि "[email protected]" जादू है केवल जब वहाँ उद्धरण में और कुछ नहीं है। ये समान हैं:

set -- a "b c" d 
some_func "foo $*" 
some_func "foo [email protected]" 

दोनों मामलों में, some_func को एक तर्क प्राप्त होता है।

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