Passa matriz para o parâmetro de função no terminal dentro de loop

0

Eu tenho o seguinte código:

myfunc(){
    group=("$1")

    for i in "${group[@]}"
        do
            printf "%s\n" "$i"
        done
}

Estou usando para imprimir todos os itens no array group . Essa matriz deve ser um parâmetro no terminal. Mas quando tento usá-lo no terminal dentro do arquivo .bash_profile ele não funciona. Estou tentando isso executando o seguinte comando:

myfunc ("one" "two" "three")
    
por muru 27.10.2016 / 12:12

1 resposta

2

Parece que você espera que o shell gere algum tipo de variável de matriz anônima - AFAIK que não é possível em bash .

A abordagem simples é passar argumentos individuais (que podem conter espaços em branco, se citados corretamente) e, em seguida, referir-se a eles com "$@"

myfunc ()
{
    group=("$@");
    for i in "${group[@]}"
    do
        printf "%s\n" "$i"
    done
}

depois, por exemplo

$ myfunc "one nine" "two" "three four five"
one nine
two
three four five

embora neste caso em particular eu não veja nenhum benefício da variável array adicional - você pode também fazer um loop sobre "$@" diretamente:

myfunc ()
{
    for i in "$@"
    do
        printf "%s\n" "$i"
    done
}

Se você quer apenas que "pareça uma matriz" no contexto de chamada, a única maneira que posso pensar em fazer isso seria passá-la como string myfunc '("one nine" "two" "three four five")' e, em seguida, eval da atribuição dentro de sua função eval group="$1" , mas eu não recomendo fazer isso.

    
por steeldriver 27.10.2016 / 13:56