O Bash não suporta diretamente a devolução de arrays de funções. No entanto, podemos alcançar isso usando técnicas inteligentes. Este artigo explora dois métodos eficazes: usando substituição de comandos e manipulando o Separador de Campos Interno (IFS).
Sumário
- Substituição de Comando
- Retornando Arrays com Substituição de Comando
- Retornando Arrays com IFS
- Escolhendo o Melhor Método
Substituição de Comando
A substituição de comando captura a saída de um comando e a atribui a uma variável. Isso forma a base do nosso primeiro método. A chave é formatar a saída da função para facilitar a análise de volta para um array.
Retornando Arrays com Substituição de Comando
Este método envolve juntar elementos de array em uma string usando um delimitador, e então dividir a string de volta em um array. Vamos ver um exemplo:
my_array_function() {
local array=("apple" "banana" "cherry")
local delimiter="|"
echo "${array[*]}" | tr ' ' 'n' | paste -sd"$delimiter" -
}
returned_string=$(my_array_function)
returned_array=(${returned_string//|$delimiter/ })
echo "Array retornado: ${returned_array[@]}"
Veja como funciona:
my_array_function
cria um array local.- Ele usa
echo
,tr
para substituir espaços por novas linhas epaste
para juntar os elementos com o delimitador. - A substituição de comando captura a saída em
returned_string
. - A expansão de parâmetros substitui o delimitador por espaços para criar o array
returned_array
.
Esta abordagem é simples e eficaz, mas o delimitador não pode aparecer nos elementos do array. Se isso acontecer, considere usar um caractere menos comum ou um método de tratamento de delimitadores mais robusto.
Retornando Arrays com IFS
O Separador de Campos Interno (IFS) controla como o Bash divide strings em palavras. Podemos usar isso para retornar arrays definindo IFS dentro da função e imprimindo os elementos do array. O script de chamada então usa o IFS modificado para analisar a saída.
my_array_function() {
local array=("apple" "banana" "cherry")
local old_ifs="$IFS"
IFS=$'n'
printf "%sn" "${array[@]}"
IFS="$old_ifs"
}
returned_array=($(my_array_function))
echo "Array retornado: ${returned_array[@]}"
Explicação:
my_array_function
salva o IFS atual.- Ele define IFS como um caractere de nova linha.
- Ele imprime cada elemento do array em uma nova linha.
- Ele restaura o IFS.
- O script de chamada usa a nova linha como separador para criar o array.
Este método é mais limpo se os elementos do seu array não contiverem novas linhas. Para elementos contendo novas linhas, você precisa escolher um caractere IFS diferente e menos provável.
Escolhendo o Melhor Método
Ambos os métodos oferecem soluções viáveis. A melhor escolha depende de suas necessidades específicas e do conteúdo do array. A abordagem de substituição de comando oferece mais flexibilidade na seleção de delimitadores, enquanto o uso de IFS pode ser mais limpo se seus dados permitirem. Sempre priorize código limpo, robusto e bem comentado.