Postagem em destaque

Criando bot do Telegram em Shell script com ShellBot

Criando função append para array indexado

Provavelmente você já deve ter lido sobre array, suas estruturas de dados e as vantagens na sua utilização. Em linguagens de programação orientada a objetos, quando um array é instanciado, o objeto 'array'  recebe recursos extras que chamamos de métodos que auxiliam o programador durante a manipulação dos dados armazenados. Em especifico vou mencionar sobre o método append, que tem como finalidade anexar um elemento ao último índice do array (fim da fila).

O exemplo que veremos a seguir é aplicado somente em um array indexado, onde os elementos são referenciados por sua posição (inteiro positivo).

Para começar vou criar uma função que vou chamar de append (sugestivo) e conterá dois parâmetros com a seguinte sintaxe:

append [variável] [valor]

Parâmetros posicionais:


Função$1$2
append variável valor

  • Variável é o identificador (nome) do array instanciado.
  • Valor é qualquer expressão que será anexada ao array.  Para expressões compostas é necessário utilizar aspas simples (') ou duplas ("). Exemplo: 'expressao'.



Segue abaixo a estrutura da função.

#!/bin/bash

append()
{
    # Variável local
    local val

    # Testa se a variável informada foi instanciada.
    if ! declare -p $1 &>/dev/null; then
        echo "$FUNCNAME: erro: '$1' variável não instanciada ou inválida." 1>&2
        return 1    # Erro
    fi

    # Salva o valor em 'val', se 'val' for nulo, imprime mensagem
    # de erro e sai da função.
    val=${2:?$FUNCNAME: valor é obrigatório.} 1>&2

    # Cria um ponteiro que fará referẽncia ao nome da variável original contida em '$1'
    declare -n byref=$1

    # Anexa elemento se já houver elementos salvos no array, caso contrário
    # salva no índice 0.
    [ "$byref" ] && byref+=("$val") || byref[0]="$val"

    # Remove o atributo de ponteiro e limpa a variável 'byref'.
    declare +n byref; unset byref

    # Sucesso
    return 0
}
Nota: Em shell toda variável é um array desde que um valor seja associado a um índice.

Agora vamos chamar a função e passar os parâmetros. Lembre-se que a variável precisa ser declarada antes (apenas um particularidade da função criada).

# Inicializando a variável. 
cores=""
 
# Anexando os elementos no array
append cores 'azul claro'
append cores 'verde claro'

# Imprimindo todos os elementos
printf '%s\n' "${cores[@]}"
azul claro
verde claro

# Anexando mais um elemento
append cores 'vermelho'

# Imprimindo novamente todos os elementos
printf '%s\n' "${cores[@]}"
azul claro
verde claro
vermelho

Note que os elementos foram devidamente anexados ao array passado na função, Por que? Ao declarar a variável 'byref' utilizando o comando 'declare -n byref=$1', cria-se um ponteiro e associa-se o nome do array armazenado em '$1', ou seja, toda alteração aplicada em byref na verdade está sendo realizada na variável original.

Também é possível anexar o elemento utilizando somente a linha de comando: 

nome_array+=('valor')

Se a linha acima funciona, porque criar uma função? 

Lembre-se o objetivo é explorar as possibilidades e demonstrar o poder do shell no desenvolvimento de soluções. 

Veja também: Expansão de arrays

Comentários

  1. Amigo
    Existe a possibilidade de fazer que as mensagens que chegue em um bot seja encaminhada para um grupo?

    ResponderExcluir
    Respostas
    1. Somente se o bot for membro do grupo ao qual você deseja enviar a mensagem.

      Excluir

Postar um comentário

Contato

Nome

E-mail *

Mensagem *