मैं पहली बार एक बैश पूरा लिखने पर एक छुरा ले जा रहा हूं, और मैं बैर सरणियों ( ${array[@]}
और ${array[*]}
) के दो तरीकों के बारे में थोड़ा भ्रमित हूं ।
यहां कोड का प्रासंगिक हिस्सा है (यह काम करता है, वैसे, लेकिन मैं इसे बेहतर समझना चाहूंगा):
_switch()
{
local cur perls
local ROOT=${PERLBREW_ROOT:-$HOME/perl5/perlbrew}
COMPREPLY=()
cur=${COMP_WORDS[COMP_CWORD]}
perls=($ROOT/perls/perl-*)
# remove all but the final part of the name
perls=(${perls[*]##*/})
COMPREPLY=( $( compgen -W "${perls[*]} /usr/bin/perl" -- ${cur} ) )
}
बैश के दस्तावेज कहते हैं :
किसी सरणी के किसी भी तत्व को $ {name [सबस्क्रिप्ट]} का उपयोग करके संदर्भित किया जा सकता है। ब्रेस को शेल के फाइलनाम विस्तार ऑपरेटरों के साथ संघर्ष से बचने के लिए आवश्यक है। यदि सबस्क्रिप्ट '@' या '*' है, तो शब्द ऐरे नाम के सभी सदस्यों तक फैलता है। ये सदस्यता केवल तभी भिन्न होती है जब शब्द दोहरे उद्धरण चिह्नों में प्रकट होता है। यदि यह शब्द दोहरा-उद्धृत है, तो $ {name [*]} IFS चर के पहले वर्ण द्वारा अलग किए गए प्रत्येक सरणी सदस्य के मान के साथ एक शब्द तक फैलता है, और $ {name [@]} नाम के प्रत्येक तत्व का विस्तार करता है एक अलग शब्द के लिए।
अब मुझे लगता है कि मैं समझता हूं कि compgen -W
एक स्ट्रिंग संभावित विकल्पों की शब्द सूची से युक्त है, लेकिन इस संदर्भ में मुझे समझ में नहीं आता है कि "$ {name [@]} प्रत्येक तत्व को एक अलग शब्द के अर्थ में विस्तारित करता है"।
लंबी कहानी छोटी: ${array[*]}
काम करता है; ${array[@]}
ऐसा नहीं करता। मैं जानना चाहूंगा कि क्यों, और मैं बेहतर तरीके से समझना चाहता हूं कि वास्तव में इसका ${array[@]}
विस्तार क्या है ।