शेल स्क्रिप्ट में $ @ का क्या अर्थ है?


189

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

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

umbrella_corp_options $@


1
संभव डुप्लिकेट डुप्लिकेट क्या हैं विशेष डॉलर साइन शेल चर?
jww

जवाबों:


240

$@है सभी मापदंडों स्क्रिप्ट के लिए पारित की।

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

यदि तुम करो:

./someScript.sh foo bar

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

umbrella_corp_options "$@"

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


1
यदि मैंने किया तो $ @ में क्या होगा someScript.sh foo bar "boo far"?
trusktr


7
$ @ विशेष है यदि दोहरे उद्धरण चिह्नों में लिखा गया है। तो यह आपके मान में, उद्धृत मामले में, त्रुष्टक, तीन तर्कों "फू", "बार", और "बू दूर" की सूची में परिणाम देगा।
एल्फ

4
यद्यपि यह आम तौर पर मामला है, $@जरूरी नहीं कि स्क्रिप्ट में उत्तीर्ण पैरामाटर्स से ... उदाहरण के लिए; set a b "x   y"; printf '(%s)' "$@"आउटपुट(a)(b)(x   y)
पीटर।

मुझे अल्फ का जवाब बेहतर लगता है क्योंकि वह बीच में मुख्य अंतर देता है $@और$*
डोलेप

106

$@के रूप में लगभग एक ही है $*, दोनों का अर्थ है "सभी कमांड लाइन तर्क"। वे अक्सर किसी अन्य प्रोग्राम के लिए सभी तर्क पारित करने के लिए उपयोग किए जाते हैं (इस प्रकार उस अन्य प्रोग्राम के आसपास एक आवरण बनाते हैं)।

दो सिंटैक्स के बीच का अंतर तब दिखाई देता है जब आपके पास इसमें रिक्त स्थान के साथ एक तर्क होता है (जैसे) और $@दोहरे उद्धरण चिह्नों में लगाया जाता है:

wrappedProgram "$@"
# ^^^ 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"

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

"$@": wrappedProgram "one two    three" four five "six seven"
"$*": wrappedProgram "one two    three four five six seven"
                             ^^^^ These spaces are part of the first
                                  argument and are not changed.
$*:   wrappedProgram one two three four five six seven

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

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

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

मुझे लगता है कि इस शब्द ने उन लोगों के लिए एक अंतर का नरक बना दिया जो पहले वाक्य पढ़ने के बाद फैसला देते हैं ;-) और यह मेरी इच्छा के विरुद्ध कभी नहीं था। मैं वास्तव में इन लोगों के लिए भी लिखना चाहूंगा।
अल्फ

बहुत अस्पष्ट है। wrappedProgram "$*"-> separated by single spaces.लेकिन आपके दूसरे उदाहरण में वे सिंगल स्पेस से अलग नहीं हुए हैं।
फेलिक्स डॉमबेक

36

ये कमांड लाइन तर्क हैं:

$@= स्ट्रिंग की सूची में
$*सभी तर्कों को संग्रहीत करता है = सभी तर्कों को एक स्ट्रिंग के रूप में
$#संग्रहीत करता है = तर्कों की संख्या को संग्रहीत करता है


(@Iruvar द्वारा उल्लिखित अशुद्धि को ठीक किया गया था।)
मातेन उल्हाक

13

$@अधिकांश मामलों में एक शुद्ध साधन का उपयोग "प्रोग्रामर को जितना संभव हो उतना मुश्किल चोट पहुंचाता है", क्योंकि ज्यादातर मामलों में यह शब्द पृथक्करण और रिक्त स्थान के साथ और तर्कों में अन्य पात्रों के साथ समस्याओं की ओर जाता है।

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

for a in "$@"; do something_with "$a"; done

4
आपकी पंक्ति के रूप में लिखा जा सकता है: एक के लिए; do_with कुछ "$ a"; ;-)
अल्फ

1
@ मुझे पता है, मैं बस इसे भूल गया था। इसे for a in start_token "$@" end_token; do something_with "$a"; done:-)
समझें

9

मैनुअल से:

@

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


1

मतलब।

संक्षेप में, $@कॉलर से किसी फ़ंक्शन या स्क्रिप्ट के लिए पास किए गए स्थितीय तर्कों का विस्तार होता है । इसका अर्थ संदर्भ-निर्भर है : एक फ़ंक्शन के अंदर, यह ऐसे फ़ंक्शन को दिए गए तर्कों तक फैलता है। यदि एक स्क्रिप्ट में उपयोग किया जाता है (कार्य के दायरे के अंदर नहीं), तो यह इस तरह की स्क्रिप्ट को दिए गए तर्कों तक फैलता है।

$ cat my-sh
#! /bin/sh
echo "$@"

$ ./my-sh "Hi!"
Hi!
$ put () ( echo "$@" )
$ put "Hi!"
Hi!

शब्द विभाजन।

अब, एक और विषय जो $@शेल में व्यवहार करता है, यह समझने के लिए सबसे महत्वपूर्ण है कि शब्द विभाजन कैसे होता है । शेल IFSचर की सामग्री के आधार पर टोकन को विभाजित करता है। इसका डिफ़ॉल्ट मान है \t\n; यानी, व्हाट्सएप, टैब और न्यूलाइन।

विस्तार "$@"से आपको पारित तर्कों की एक प्राचीन प्रति मिलती है । हालांकि, विस्तार $@हमेशा नहीं होगा। विशेष रूप से, यदि तर्कों में वर्ण होते हैं, तो IFSवे विभाजित हो जाएंगे।


अधिकांश समय आप जो उपयोग करना चाहेंगे "$@", वह नहीं है $@

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.