@
शेल स्क्रिप्ट में एक डॉलर के चिह्न का एक एट-साइन ( ) के बाद क्या मतलब है?
उदाहरण के लिए:
umbrella_corp_options $@
@
शेल स्क्रिप्ट में एक डॉलर के चिह्न का एक एट-साइन ( ) के बाद क्या मतलब है?
उदाहरण के लिए:
umbrella_corp_options $@
जवाबों:
$@
है सभी मापदंडों स्क्रिप्ट के लिए पारित की।
उदाहरण के लिए, यदि आप कॉल करते हैं ./someScript.sh foo bar
तो $@
बराबर होगा foo bar
।
यदि तुम करो:
./someScript.sh foo bar
और फिर someScript.sh
संदर्भ के अंदर :
umbrella_corp_options "$@"
यह umbrella_corp_options
दोहरे उद्धरण चिह्नों में संलग्न प्रत्येक व्यक्तिगत पैरामीटर के साथ पारित किया जाएगा , जिससे कॉलर से रिक्त स्थान के साथ पैरामीटर ले सकते हैं और उन्हें पास कर सकते हैं।
someScript.sh foo bar "boo far"
?
$@
जरूरी नहीं कि स्क्रिप्ट में उत्तीर्ण पैरामाटर्स से ... उदाहरण के लिए; set a b "x y"; printf '(%s)' "$@"
आउटपुट(a)(b)(x y)
$@
और$*
$@
के रूप में लगभग एक ही है $*
, दोनों का अर्थ है "सभी कमांड लाइन तर्क"। वे अक्सर किसी अन्य प्रोग्राम के लिए सभी तर्क पारित करने के लिए उपयोग किए जाते हैं (इस प्रकार उस अन्य प्रोग्राम के आसपास एक आवरण बनाते हैं)।
दो सिंटैक्स के बीच का अंतर तब दिखाई देता है जब आपके पास इसमें रिक्त स्थान के साथ एक तर्क होता है (जैसे) और $@
दोहरे उद्धरण चिह्नों में लगाया जाता है:
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
wrappedProgram "$*"
-> separated by single spaces.
लेकिन आपके दूसरे उदाहरण में वे सिंगल स्पेस से अलग नहीं हुए हैं।
ये कमांड लाइन तर्क हैं:
$@
= स्ट्रिंग की सूची में
$*
सभी तर्कों को संग्रहीत करता है = सभी तर्कों को एक स्ट्रिंग के रूप में
$#
संग्रहीत करता है = तर्कों की संख्या को संग्रहीत करता है
$@
अधिकांश मामलों में एक शुद्ध साधन का उपयोग "प्रोग्रामर को जितना संभव हो उतना मुश्किल चोट पहुंचाता है", क्योंकि ज्यादातर मामलों में यह शब्द पृथक्करण और रिक्त स्थान के साथ और तर्कों में अन्य पात्रों के साथ समस्याओं की ओर जाता है।
सभी मामलों में (अनुमानित) 99%, इसे संलग्न करना आवश्यक है "
: "$@"
तर्कों पर मज़बूती से पुनरावृति करने के लिए इसका उपयोग किया जा सकता है।
for a in "$@"; do something_with "$a"; done
for a in start_token "$@" end_token; do something_with "$a"; done
:-)
@
एक से शुरू होकर, स्थितिगत मापदंडों का विस्तार करता है। जब विस्तार दोहरे उद्धरण चिह्नों के भीतर होता है, तो प्रत्येक पैरामीटर एक अलग शब्द में फैलता है। यही है, "$ @" "$ 1" "$ 2" के बराबर है .... यदि एक शब्द के भीतर दोहरा-उद्धृत विस्तार होता है, तो पहले पैरामीटर का विस्तार मूल शब्द के शुरुआती भाग के साथ जुड़ जाता है, और अंतिम पैरामीटर का विस्तार मूल शब्द के अंतिम भाग के साथ जुड़ जाता है। जब कोई स्थितिगत पैरामीटर नहीं होते हैं, तो "$ @" और $ @ का विस्तार कुछ भी नहीं होता है (यानी, उन्हें हटा दिया जाता है)।
संक्षेप में, $@
कॉलर से किसी फ़ंक्शन या स्क्रिप्ट के लिए पास किए गए स्थितीय तर्कों का विस्तार होता है । इसका अर्थ संदर्भ-निर्भर है : एक फ़ंक्शन के अंदर, यह ऐसे फ़ंक्शन को दिए गए तर्कों तक फैलता है। यदि एक स्क्रिप्ट में उपयोग किया जाता है (कार्य के दायरे के अंदर नहीं), तो यह इस तरह की स्क्रिप्ट को दिए गए तर्कों तक फैलता है।
$ cat my-sh
#! /bin/sh
echo "$@"
$ ./my-sh "Hi!"
Hi!
$ put () ( echo "$@" )
$ put "Hi!"
Hi!
अब, एक और विषय जो $@
शेल में व्यवहार करता है, यह समझने के लिए सबसे महत्वपूर्ण है कि शब्द विभाजन कैसे होता है । शेल IFS
चर की सामग्री के आधार पर टोकन को विभाजित करता है। इसका डिफ़ॉल्ट मान है \t\n
; यानी, व्हाट्सएप, टैब और न्यूलाइन।
विस्तार "$@"
से आपको पारित तर्कों की एक प्राचीन प्रति मिलती है । हालांकि, विस्तार $@
हमेशा नहीं होगा। विशेष रूप से, यदि तर्कों में वर्ण होते हैं, तो IFS
वे विभाजित हो जाएंगे।
अधिकांश समय आप जो उपयोग करना चाहेंगे "$@"
, वह नहीं है $@
।