क्यों --text = "$ @" केवल पहला शब्द है?


9

जब मैं निम्नलिखित स्क्रिप्ट को कुछ तर्कों के साथ चलाता हूं arg1 arg2 arg3:

#!/bin/bash
zenity --entry --text="$@"

zenity इस टेक्स्ट के साथ एक एंट्री डायलॉग बनाती है: "arg1" जबकि मुझे उम्मीद है कि "arg1 arg2 arg3"

यदि मैं निम्न स्क्रिप्ट की तरह एक चर का उपयोग करता हूं तो यह प्रवेश पाठ के सभी तर्कों को दिखाता है।

#!/bin/bash
text="$@"
zenity --entry --text="$text"

इन लिपियों में क्या अंतर है? $@पहले वाले को केवल पहले तर्क से क्यों बदला जाता है?

जवाबों:


16

$@अलग-अलग शब्दों में $*विस्तार होता है (जबकि एक शब्द में विस्तार होता है), जैसा कि bashमैनुअल में बताया गया है । इस प्रकार, जब आप लिखते हैं

zenity --text="$@"

इसका विस्तार होता है

zenity --text="$1" "$2" "$3"

हालाँकि, शेल वैरिएबल असाइनमेंट शब्द विभाजन से नहीं गुजरते हैं। ध्यान दें कि फ़ील्ड / शब्द विभाजन bashमैनुअल में चर असाइनमेंट के लिए विस्तार की सूची में छोड़ा गया है । यह व्यवहार POSIX युक्ति के अनुरूप है । इसलिए, जब आप लिखते हैं

text="$@"

textयदि आपने लिखा था तो चर एक शब्द के रूप में सभी स्थितीय मापदंडों को प्राप्त करता है text="$*"। दरअसल, यही कारण है कि दोहरे असाइनमेंट अक्सर चर असाइनमेंट में अनावश्यक होते हैं। दोनों

text=$@

तथा

text=$*

पूरी तरह से सुरक्षित हैं।

इसलिए,

text=$@
zenity --option="$text"

"$text"एक शब्द का विस्तार करता है, यही कारण है कि यह काम करता है। ध्यान दें कि --option="$@"कमांड के लिए सिर्फ एक सामान्य तर्क है zenity, और शेल चर असाइनमेंट नहीं है, यही कारण है कि शब्द विभाजन यहां नहीं बल्कि अंदर होता है text=$@


1
+1। यह भी काम करेगा: zenity --text="$*"- "$*"एक शब्द के लिए फैलता है।
ग्लेन जैकमैन

+1 मुझे एक चीज सिखाने के लिए: आदमी! = प्रलेखन। मुझे जानकारी बैश की खोज करनी चाहिए थी, इसमें वह मैनुअल सेक्शन भी शामिल है जिसे आपने लिंक किया था।
मैनटवर्क

7

$@ अलग-अलग शब्द में प्रत्येक पैरामीटर का विस्तार करें, बन रहा है

zenity --entry --text="arg1" "arg2" "arg3" # syntactically wrong for zenity

$*एक शब्द में इसका विस्तार करने के बजाय उपयोग करें

zenity --entry --text="$*"

जो बन जाएगा

zenity --entry --text="arg1 arg2 arg3" # syntactically correct for zenity

कृपया इस बात पर प्रकाश डालें कि ओपी के सवाल से $ टेक्स्ट वेरिएंट क्यों अपेक्षित है
irvar

@ChandraRavoori, आपने मुझे उसके साथ पकड़ा। मैनुअल के अनुसार "शब्द विभाजन का प्रदर्शन नहीं किया जाता है," $ @ "के अपवाद के साथ" और "यदि दोहरे-उद्धृत विस्तार एक शब्द के भीतर होता है, तो पहले पैरामीटर का विस्तार मूल शब्द के शुरुआती भाग के साथ जुड़ जाता है, और अंतिम पैरामीटर का विस्तार मूल शब्द के अंतिम भाग के साथ शामिल हो गया है। ”, इसलिए मैं इसके text="$@"विस्तार की उम्मीद करूंगा text="arg1" "arg2" "arg3", जिसे विफल होना चाहिए। लेकिन निश्चित रूप से ऐसा नहीं है।
मैनटवर्क

@ChandraRavoori कारण यह है कि क्षेत्र विभाजन वैरिएंट असाइनमेंट में नहीं होता है। मैं अपने उत्तर में अधिक विस्तार से समझाता हूं ।
jw013

@ jw013: लेकिन के अनुसार बैश संदर्भ मैनुअल , "$@" करता है शब्द बंटवारे से गुजरना, यहां तक कि चर कार्य में।
रूतख

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