Você pode passar um array para uma função, mas apenas fazer um parâmetro da função receber o array inteiro?

2

Se eu passar uma matriz para uma função:

func()
{
    echo $1
    echo $2
    echo $3
}

myArray=("This" "Is" "An Array")
func "${myArray[@]}"

Em seguida, cada elemento da matriz será passado para um parâmetro separado da função.

Existe uma maneira de fazer apenas um parâmetro da função receber o array inteiro?

    
por John 22.01.2018 / 10:33

1 resposta

2

Você pode, mais ou menos. Bash e ksh93 possuem referências de nome, que são um pouco como ponteiros e permitem que você passe o array nome para a função, e use-o de lá, diga:

#!/bin/bash    
function byname {
        typeset -n _p=$1
        echo "second item of '$1' is ${_p[1]}"
        echo "second arg to this function is \"$2\""
}
blah=(a b c)
byname blah "other arg"

Embora no Bash, o nome do nameref ( _p here) deve ser diferente do nome da variável para a qual ele aponta, portanto, não é muito utilizável com funções recursivas. No ksh, ele trabalha com o mesmo nome apenas em funções de estilo ksh ( function foo em vez de foo() ).

Como diz o rótulo, é uma referência , não uma cópia, por isso, se você modificar a matriz na função, as alterações serão exibidas no programa principal.

A outra alternativa, pior, é concatenar a matriz para uma string e passá-la como uma variável:

function concated {
        echo "the whole array is \"$1\""
}
concated "${blah[*]}"

Mas isso praticamente impossibilita o uso de um array, a menos que você crie um sistema elaborado de array para o empacotamento de strings.

As chamadas acima da impressão do curso:

second item of 'blah' is b
second arg to this function is "other arg"
the whole array is "a b c"
    
por 22.01.2018 / 12:45

Tags