Declaração de variáveis no Bash

declare1_abertura

Depois de ter tratado, não necessariamente nesta ordem, de arrays, números inteiros e strings em Bash seria interessante fazer duas coisas: (i) citar os outros tipos de variáveis disponíveis e (ii) tratar de opções bastante interessantes disponíveis no comando declare. Ele é utilizado para definir tanto o tipo da variável como também habilitar, ou desabilitar, determinados atributos desta.

Para facilitar seguirei a ordem das opções conforme estão listadas em “help declare” e assim aproveitar para também comentar algo mais sobre os tipos já citados.

Array indexado

É o parâmetro “-a” e ao usá-lo você cria um array indexado no Bash, ou seja, será criada uma variável contendo uma lista onde os índices são números:

$ declare -a INDEX=("Azul" "Verde" "Vermelho")
$ for ((I=0;I<3;I++)); do echo $I ${INDEX[I]}; done
0 Azul
1 Verde
2 Vermelho

Apesar de disponível, a opção “+a”¹ não removerá o array da memória.

$ declare +a INDEX
bash: declare: INDEX: não é possível destruir variáveis de
matriz desta forma

Para isto use use o comando unset.

(¹) Acontece com o declare o mesmo que no comando set, onde o sinal de menos — - — habilita e o sinal de mais — + — desabilita.

Array associativo

Sério? Basta usar o parâmetro “-A”, o funcionamento é igual ao dos arrays indexados e a diferença está justamente em se usar como chave uma string ao invés de um índice numérico.

$ declare -A ASSOC
$ ASSOC['vermelho']="#ff0000"
$ ASSOC['verde']="#00ff00"
$ ASSOC['azul']="#0000ff"

Para acessar os elementos use sua chave:

$ echo ${ASSOC['verde']}
#00ff00

Use o ponto de exclamação —  ! —  para obter uma lista das chaves em uso dentro do array ao invés de seus elementos.

$ echo ${!ASSOC[@]}
vermelho azul verde

Claro, não espere que a ordem dos elementos tenha a mesma ordem da inserção.

$ for KEY in ${!ASSOC[@]}; do echo "${KEY} : ${ASSOC[${KEY}]}";\
done
vermelho : #ff0000
azul : #0000ff
verde : #00ff00

Aqui valem tanto a recomendação do unset ao invés da opção “+A” como também tudo o que foi tratado lá na primeira publicação sobre arrays.

Números inteiros

É o parâmetro “-i” e serve para definir a variável como um número inteiro.

$ declare -i NUMERO=1973
$ echo ${NUMERO}
1973
$ NUMERO+=44
$ echo ${NUMERO}
2017

E como foi definida com o atributo para número inteiro ela tentará identificar o valor numérico no caso de receber uma string.

$ NUMERO="123"; echo ${NUMERO{
123
$ NUMERO="Giovanni"; echo ${NUMERO}
0

Porém é possível utilizar o parâmetro “+i” para desabilitar a tipagem da variável.

$ NUMERO=2017
$ declare +i NUMERO
$ NUMERO+=" é o ano atual."
$ echo ${NUMERO}
2017 é o ano atual.

A parte boa é que o valor não será perdido, apenas o atributo que força o tipo desligado, logo é possível concatená-la como uma string ou outras variáveis sem muitos problemas.

Conversão de caixa

Os parâmetros “-l” e “-u” servem para, respectivamente, forçar a conversão automática para letras minúsculas e maiúsculas nas strings — isto foi explicado na parte sobre manipulação de strings — mas não citei é que estes atributos podem ser ligados e desligados dentro da variável a qualquer instante.

$ declare -l MESG="LoCaLHOST.Localdomain"
$ echo ${MESG}
localhost.localdomain
$ declare +l MESG
$ MESG="ATENÇÃO : O host '${MESG}' não está acessível!"
$ echo ${MESG}
ATENÇÃO : O host 'localhost.localdomain' não está acessível

E assim como ocorre no tipo inteiro, ligar e desligar um atributo não afeta imediatamente seu conteúdo e só fazendo efeito em uma próxima atribuição de valor.

declare -u MESG
$ echo ${MESG}
ATENÇÃO : O host 'localhost.localdomain' não está acessível!
$ MESG+=" erro!"
$ echo ${MESG}
ATENÇÃO : O HOST 'LOCALHOST.LOCALDOMAIN' NÃO ESTÁ ACESSÍVEL! ERRO!

Claro, o exemplo é bobo mas serve para a demonstração. 🙂

Referência a uma variável

O parâmetro “-n” faz com que a variável passe a apontar para o conteúdo de uma outra variável cujo nome é seu conteúdo. Confuso? Veja o exemplo.

$ I="Minha variável"
$ declare -n J
$ J="I"
$ echo ${J}
Minha variável

Este comportamento é análogo ao uso do ponto de exclamação — ! — na frente do nome.

$ K="I"
$ echo $(!K}
Minha variável

Ao utilizar o parâmetro “+n” a ligação é desfeita e ela volta a ser uma variável comum.

$ declare +n J
$ echo ${J}
I

Um outro detalhe, isto serve apenas para a leitura do conteúdo e não para a alteração (indireta) deste.

Apenas leitura

Ao utilizar o parâmetro “-r” o conteúdo da variável tornar-se-á apenas para leitura com o Bash evitando modificações no conteúdo dela — tecnicamente ela vira uma constante.

$ declare -r SYSTEM=$( uname --operating-system )
$ echo $SYSTEM
GNU/Linux
$ SYSTEM="FreeBSD"
bash: SYSTEM: a variável permite somente leitura

Vale lembrar duas coisas, a primeira é que a atribuição do conteúdo deverá vir junto com o comando declare (ou antes) e que o parâmetro “+r” desligará o atributo fazendo-a novamente ser uma variável no sentido estrito da palavra. 🙂

Depuração

Parece haver alguma confusão sobre a função do parâmetro “-t” mas o Manual do Bash é claro quanto a isto não ter utilidade com variáveis.

Give each name the trace attribute. Traced functions inherit the DEBUG and RETURN traps from the calling shell. The trace attribute has no special meaning for variables.

Neste caso, tanto DEBUG quanto RETURN constituem sinais falsos que podem ser interceptados pelo trap em cada comando executado e quando uma função é finalizada, respectivamente.

Verificando o conteúdo

O parâmetro “-p” permite exibir os atributos e respectivos valores de uma variável.

$ declare -p ASSOC
declare -A ASSOC='([vermelho]="#ff0000" [azul]="#0000ff"
[verde]="#00ff00" )'

É bastante útil para se verificar se a variável tem realmente aquilo que você está acreditando ter nela armazenado.

Finalizando

Agora a recriação de algo bastante conhecido e copiado recorrendo somente ao que está disponível no Bash e a alguns caracteres da tabela Unicode — uma eventual tradução para o japonês seria (divertidamente) bem vinda! 😀

E para terminar, quando usado dentro de uma função o declare sempre criará variáveis de escopo local (funcionando de modo equivalente ao fazê-lo com local), para forçar a criação de variáveis com escopo global dentro fa função use o parâmetro “-g” e para exportá-las o parâmetro “-x ” (que equivale ao comando export).

Até!

Anúncios

2 comentários sobre “Declaração de variáveis no Bash

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s