Bash Scripting

Retornando Eficientemente Vetores de Funções Bash

Spread the love

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

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:

  1. my_array_function cria um array local.
  2. Ele usa echo, tr para substituir espaços por novas linhas e paste para juntar os elementos com o delimitador.
  3. A substituição de comando captura a saída em returned_string.
  4. 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:

  1. my_array_function salva o IFS atual.
  2. Ele define IFS como um caractere de nova linha.
  3. Ele imprime cada elemento do array em uma nova linha.
  4. Ele restaura o IFS.
  5. 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.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *