2009-01-14 110 views

回答

-1

想出了一個解決辦法:

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

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

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

如果參數2是白色的分隔文本,例如串'badkljf odod'

+1

這可能是您的特定未表達需求的解決方法,但與問題幾乎沒有任何關係。對於這個問題,「如何拆分參數?」 – peth 2012-11-08 01:09:13

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] 

我知道bash所做的類似雜技其完成的系統,我想zsh也可能。這並不太常見。

0

沒有用一個匿名數組解決......但我試過這個東西! BASH !! ...

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

您可以通過數組函數,然後該函數可以通過解釋的名稱作爲變量名讀取陣列。這是一種技術,對於像bash中的關聯數組這樣的東西也是有用的。 ZSH使得它非常容易實現,因爲(P)操作符將以所需的方式解釋變量。

一個例子會說明這一點。如果定義了此功能:

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 
相關問題