2009-01-14 13 views

Respuesta

-1

encontrado una solución:

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

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

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

Dónde parámetro2 es una cadena de texto separados blanco, por ejemplo, 'a badkljf odod'

+1

Esto puede ser una solución para sus requisitos particulares no expresados, pero no tiene prácticamente nada que ver con la pregunta. Esta es una respuesta a la pregunta, "¿Cómo divido un parámetro?" – peth

3

No puede. Las funciones toman parámetros posicionales como cualquier otro comando.

Tenga en cuenta también que su solución alternativa no permite que ninguno de los elementos de "matriz" contenga espacios en blanco.

Lo más limpia que puedo pensar es exigir que la persona que llama a crear una matriz local, luego leerlo desde la función:

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

Sé que hace bash acrobacias similares para su sistema de finalización, y creo zsh podría, también. No es muy inusual

0

No se resolvió con una matriz anónima ... ¡¡Pero intenté con esto !! 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

Usted puede pasar el nombrede la matriz a la función y entonces la función puede leer la matriz mediante la interpretación del nombre como un nombre de variable. Es una técnica que también es útil para cosas como arreglos asociativos en bash. ZSH lo hace muy fácil de hacer, ya que el operador (P) interpretará la variable de la manera deseada.

Un ejemplo aclarará esto. Si define esta función:

function i_want_array() { 
    local array_name=$1 

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

A continuación, el siguiente código ejecutarlo:

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

Y sólo para aclarar, esto funciona mediante una operación en la matriz real, así que cualquier espacio en blanco se maneja correctamente:

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

Si solo necesita un parámetro de matriz: como cola args.

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 
Cuestiones relacionadas