जब तक यह बदसूरत है, तब तक यहां एक वर्कअराउंड है जो तब तक काम करता है जब तक आप किसी सरणी को स्पष्ट रूप से पारित नहीं कर रहे हैं, लेकिन एक सरणी के अनुरूप एक चर:
function passarray()
{
eval array_internally=("$(echo '${'$1'[@]}')")
# access array now via array_internally
echo "${array_internally[@]}"
#...
}
array=(0 1 2 3 4 5)
passarray array # echo's (0 1 2 3 4 5) as expected
मुझे यकीन है कि कोई व्यक्ति इस विचार के क्लीनर कार्यान्वयन के साथ आ सकता है, लेकिन मैंने इसे एक सरणी के रूप में पारित करने "{array[@]"}
और फिर आंतरिक रूप से उपयोग करने से बेहतर समाधान पाया है array_inside=("$@")
। यह तब और जटिल हो जाता है जब अन्य स्थिति / getopts
पैरामीटर होते हैं। इन मामलों में, मुझे पहले निर्धारित करना है और फिर कुछ shift
और संयोजन तत्व हटाने के उपयोग से सरणी से जुड़े मापदंडों को नहीं हटाना है।
एक शुद्धतावादी दृष्टिकोण इस दृष्टिकोण को भाषा के उल्लंघन के रूप में देखता है, लेकिन व्यावहारिक रूप से बोलना, इस दृष्टिकोण ने मुझे बहुत सारे दु: खों से बचाया है। एक संबंधित विषय पर, मैं eval
एक पैरामीटर के लिए आंतरिक रूप से निर्मित सरणी को असाइन करने के लिए उपयोग करता हूं जिसका नाम एक पैरामीटर है जिसे target_varname
मैं फ़ंक्शन को पास करता हूं:
eval $target_varname=$"(${array_inside[@]})"