2009-01-14 4 views
5

zsh में, मैं कैसे कार्यों में गुमनाम सरणियों पारित करते हैं? जैसेzsh में, मैं कैसे कार्यों में गुमनाम सरणियों पारित करते हैं?

foo() { 
    echo ${1[2]} '\n'; 
} 

a=(abc def ghi) 
foo $a 

--> def 

या आदर्श:

foo (abc def ghi) 
+0

ध्यान दें कि वास्तव में ऊपर कुछ भी काम नहीं करता है। –

उत्तर

-1

एक समाधान पता लगा: की तरह कुछ के लिए देख रहा

foo() { 
    local a=$1 
    local b=$2 

    echo ${(j:---:)${=b}} 

    foreach d in ${${=b}} 
    do 
     echo $d 
    done 
} 

कहाँ parameter2 सफेद अलग पाठ, उदा की एक श्रृंखला है 'एक badkljf odod'

+1

यह आपकी विशेष अप्रत्याशित आवश्यकताओं के लिए एक समाधान हो सकता है, लेकिन इस प्रश्न के साथ इसमें बहुत कुछ नहीं है। यह सवाल का एक एवर है, "मैं पैरामीटर कैसे विभाजित करूं?" – peth

3

आप नहीं कर सकते। कार्य किसी भी अन्य कमांड की तरह स्थितित्मक पैरामीटर लेते हैं।

यह भी ध्यान रखें कि आपके वैकल्पिक हल "सरणी" तत्वों के किसी भी खाली स्थान के शामिल होने की अनुमति नहीं है।

साफ बात मैं के बारे में सोच सकते हैं की आवश्यकता है कि फोन करने वाले एक स्थानीय सरणी बनाने के लिए, तो समारोह से इसे पढ़ने के लिए है:

$ foo() { 
    for element in $FOO_ARRAY 
    do 
     echo "[$element]" 
    done 
} 
$ local FOO_ARRAY; FOO_ARRAY=(foo bar baz quux) 
$ foo 
[foo] 
[bar] 
[baz] 
[quux] 

मैं जानता हूँ कि पार्टी इसके पूरा सिस्टम के लिए इसी तरह की कलाबाजी करता है, और मुझे लगता है कि zsh भी हो सकता है। यह बहुत असामान्य नहीं है।

0

एक गुमनाम सरणी के साथ हल नहीं ... लेकिन मैं इस बात की कोशिश की !! मार !! ...

function join { 
    local tmp=($1) 

    for ((i=0 ; i<${#tmp[@]}-1 ; i++)) ; do 
    echo -n ${tmp[$i]}$2 
    done 

    echo ${tmp[$i]} 
} 

test="abc def ghi" 

join "$test" "|" 
3

आप कार्य करने के लिए सरणी के नाम पारित कर सकते हैं और उसके बाद समारोह में एक चर नाम के रूप में नाम की व्याख्या द्वारा सरणी पढ़ सकते हैं। यह एक ऐसी तकनीक है जो बाश में सहयोगी सरणी जैसी चीजों के लिए भी उपयोगी है। जेडएसएच इसे करना बहुत आसान बनाता है, क्योंकि (पी) ऑपरेटर वांछित तरीके से चर की व्याख्या करेगा।

एक उदाहरण यह स्पष्ट कर देगा। आप इस समारोह को परिभाषित करते हैं: फिर

function i_want_array() { 
    local array_name=$1 

    echo "first array element is: " ${(P)${array_name}[1]} 
} 

निम्नलिखित कोड निष्पादित होगा:

% a=(one two three) 
% i_want_array "a" 
first array element is: one 

और बस स्पष्ट करने के लिए, यह असली सरणी पर काम से काम करता है, इसलिए किसी भी खाली स्थान के सही ढंग से नियंत्रित किया जाता है:

% a=("one two" three) 
% i_want_array "a" 
first array element is: one two 
0

यदि आपको केवल एक सरणी पैरामीटर की आवश्यकता है: पूंछ तर्क के रूप में।

foo() { 
    : if you have any leading non-array args, grab those first: 
    local arg1="$1" 
    shift 
    local arg2="$1" 
    shift 
    : now [email protected] is your array arg 
    echo [email protected][2] '\n'; 
} 

a=(abc def ghi) 
foo "arg 1" arg2 $a 

--> def 
संबंधित मुद्दे