como posso fornecer um array como um parâmetro posicional para uma função ou script?

0

No meu script, descobri que algumas operações em uma matriz são reutilizáveis. Então, estou pensando em refatorar o código reutilizável em uma função ou script.

No entanto, como posso escrever uma função ou script para que eu possa fornecer uma matriz como um parâmetro posicional para uma função ou script? ou conseguir algo semelhante?

Obrigado.

    
por Tim 05.06.2018 / 19:24

2 respostas

3

my_func param1 param2 param2 after_this_the_array_values "${myarr[@]}"

my_func () {
    shift 4
    local array=("$@")
}
    
por 05.06.2018 / 19:27
3

Usando uma referência de nome em uma versão recente (> = 4.3) de bash :

foo () {
    local param1=$1
    local -n arr=$2

    printf 'array: %s\n' "${arr[@]}"
}

myarray=( some items go here )
foo something myarray

O nome da variável array é passado como o segundo parâmetro para a função. A função declara uma variável de referência de nome que recebe esse nome. Qualquer acesso a essa variável de referência de nome acessará a variável cujo nome foi passado para a função.

Isso obviamente funciona com mais de um array.

Note que no exemplo acima, você não pode passar uma variável chamada arr para a função, então algum cuidado deve ser tomado para evitar confrontos de nomes ( ksh93 , que também suporta referências de nomes, não tem esse problema devido a um escopo diferente).

Note que esta abordagem não funciona quando chama outro script de shell. Ao chamar outro script de shell, o array deve ser passado na linha de comando desse outro script, o que significa que ele deve ser passado como um conjunto de strings. Passar um único array dessa maneira é relativamente fácil, e o Hauke Laging mostra o básico de como fazer isso em sua resposta .

Se você tiver controle total sobre o conteúdo das matrizes, poderá codificar seus dados como cadeias únicas, possivelmente delimitando seus elementos usando algum delimitador e, em seguida, analisando essas cadeias no script de destino para reformatar as matrizes . Outra possibilidade seria adotar uma "interface" JSON entre seus scripts, o que significa que você codificaria os dados como JSON, passaria na entrada padrão dos scripts (ou similar) e decodificaria o documento usando jq . Isso parece um pouco complicado, e isso adicionaria uma sobrecarga enorme.

    
por 05.06.2018 / 19:41