बैश सरणी मानों को संदर्भित करते समय @ और * के बीच क्या अंतर है?


15

यह बैश गाइड कहता है:

यदि अनुक्रमणिका संख्या @ या * है, तो किसी सरणी के सभी सदस्यों को संदर्भित किया जाता है।

जब मैं ऐसा करता हूं:

LIST=(1 2 3)
for i in "${LIST[@]}"; do
  echo "example.$i "
done

देता है: example.1 example.2 example.3(वांछित परिणाम)।

लेकिन जब मैं उपयोग करता हूं ${LIST[*]}, तो मुझे example.1 2 3इसके बजाय मिलता है ।

क्यों?

संपादित करें: प्रिंटफ़ का उपयोग करते समय, @ और * वास्तव में समान परिणाम देते हैं।


ऐसा लगता है यह मेरे लिए काम का होगा। मैंने @ और * दोनों की कोशिश की और यह दोनों बार एक ही परिणाम का उत्पादन करने लगता है। आप किस शेल का उपयोग कर रहे हैं? echo $SHELLअपने आउटपुट को रन करें और पेस्ट करें।
रमेश

मेरा उदाहरण गलत था, यह वास्तव में केवल साथ होता है echo, साथ नहीं printf, मैंने सिर्फ देखा।
अर्जन


@goldilocks अन्य प्रश्न के बारे में है $*और $@। हालाँकि, उत्तर समान होगा और एक प्रश्न को दूसरे का सबसेट माना जा सकता है, वे अलग-अलग प्रश्न हैं।
स्टीफन चेज़लस

जवाबों:


17

अंतर सूक्ष्म है; "$ *" एक तर्क बनाता है, जबकि "$ @" अलग-अलग तर्कों में विस्तार करेगा, इसलिए:

LIST=(1 2 3)
for i in "${LIST[@]}"; do
 echo "example.$i"
done

कई चर के रूप में सूची (इसे प्रिंट करें) से निपटेंगे

परंतु

LIST=(1 2 3)
for i in "${LIST[*]}"; do
 echo "example.$i"
done

एक चर के रूप में सूची से निपटेंगे।


क्या आप जानते हैं, जहां के बीच का अंतर है echoऔर printfसे आता है? क्योंकि printfलूप के लिए के साथ , * सूची संदर्भ को कई चर के रूप में माना जाता है।
अर्जन

किसी एक बनाम कई चर के रूप में निपटाए जाने का क्या मतलब है? मुझे आश्चर्य है कि यदि आप अंतर को स्पष्ट करने के लिए एक व्यावहारिक उदाहरण प्रदान कर सकते हैं।
13:22 पर फ्राकचर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.