Concatene com o Bash e fique contente!

Publicado por Leandro Santiago em 04/04/2008

[ Hits: 18.623 ]

Blog: http://leandrosan.wordpress.com

 


Concatene com o Bash e fique contente!



Nesta dica mostro um recurso do Bash que poucos conhecem: a concatenação de strings e arranjos - conhecidos também como arrays ou vetores.

Eu sempre concatenei strings da seguinte forma:

Adicionando uma string no final de $string:

$ string="$string""nova_palavra"

E elementos no final de vetores:

$ vetor=( ${vetor[@]} $novo_elemento )

Mas, como vocês podem ver, estas são "gambiarras". Até funcionam, mas a gente fica com aquela impressão de que podia ser melhor. E realmente pode.

O segundo método, o do vetor, apresenta algumas falhas e inconsistências, principalmente quando há elementos que contém o caractere espaço " ".

Visando contornar este problema, passei a utilizar o seguinte método, já apresentado em outros textos meus aqui no VOL.

# Função que insere um novo elemento no final de um vetor
# Recebe como parâmetros:
# 1- O NOME do vetor que receberá o elemento
# 2- O valor a ser inserido

InsereFinalLista()
{
        eval local Tamanho='${#'$1'[@]}'
        eval $1\[$Tamanho\]="$2"
}

Ele recebe como parâmetro o NOME da variável que guarda o vetor, e em seguida o conteúdo a ser adicionado:

$ InsereFinalLista Vetor1 $Elemento

Mas, mesmo assim sentia que era uma solução "porca". Caramba, deve haver um jeito melhor de fazer isto!

Eis que, nas minhas fuçadas diárias e constantes no bash, utilizando aquela teoria dos infinitos macacos (que uma hora ou outra escreveriam a obra completa de Shakespeare), digitei a seguinte instrução no terminal:

$ i+=1

E não deu erro!

Então pensei: "Mas baralho, isto que fiz não foi uma operação aritmética (incremento de 1), pois, para isso, ela deveria estar entre parênteses-duplos (( ))"

O que faço? Verifico o conteúdo da variável:

$ echo $i
1

Ué? O que é isso? Uma atribuição normal? Aperto a tecla "para cima" do teclado duas vezes e teclo Enter:

$ i+=1

E exibo novamente o conteúdo da variável:

$ echo $i
11

Ué? Como é que 1 virou 11? Será que este comando adiciona dez numa variável? O que acontece é que o caractere 1 é concatenado no final da variável i!

Faço então o seguinte teste:

$ for ((i=10,j=0;i<20;i++)); do j+=$i; done

Neste comando, a variável i é inicializada com 10 e j com 0. Em cada execução do laço, i é incrementado, e seu valor (como caractere) adicionado no final da variável j. O laço acaba quando i valer 19.

Exibindo j:

$ echo $j
010111213141516171819

Provado e aprovado!

Mas será que isto só funciona para variáveis comuns? Será que funciona para arranjos (arrays, listas, vetores)?

Mas é claro que sim!

Vejam o exemplo:

$ Vetor=( a b c "d á r i o")

Vejam que um elemento tem caracteres espaço.

E adiciono mais elementos no final do vetor:

$ Vetor+=( "a e i o u" consoante )

E exibo o conteúdo da variável:

$ echo ${Vetor[@]}
a b c d á r i o a e i o u consoante

Para ficar mais claro, vamos exibir elemento por elemento:

$ for ((j=0;j<${#Vetor[@]};j++)); do echo ${Vetor[$j]}; done
a
b
c
d á r i o
a e i o u
consoante

E é isto pessoal! Espero que estes recursos facilitem a vida dos "shelleiros" de plantão ;-)

Links interessantes:
Outras dicas deste autor

Criando um planeta só seu.. no GIMP

Desligando o seu computador com o dedão do pé

Ripando CD's de áudio no XMMS.

Criando e utilizando uma "biblioteca de funções"

Ativando a correção ortográfica em português no KDE

Leitura recomendada

Como exibir números com um largura fixa de caracteres, complentando com zeros a esquerda

Controle e Automação

Arrays no BASH

Operações matemáticas diretamente pelo bash

Transforme a manpage do GNU/Linux em PDF

  

Comentários
[1] Comentário enviado por Pianista em 04/04/2008 - 17:54h

huahauhuahauhuaha! isso me fez lembrar meu professor de redes.. ele ficava doido, prq eu sempre era o diferente da turma, enquanto todo mundo fazia as coisas que ele mandava do jeito que ele mandava e escrevia varias linhas, eu so ia concatenando.. xD.. vlw!

[2] Comentário enviado por fulllinux em 04/04/2008 - 21:33h

Esse é o tenchi, que um dia ei de conhecer...sempre dedicando seu tempo ao bash...quando crescer quero ser como você meu velho...run scripts neles...

Abraço!

[3] Comentário enviado por tenchi em 05/04/2008 - 00:15h

Valeu pelos comentários, e aqui vai mais uma aplicação:
Definindo elementos específicos de um array:
$ Array=([0]=azar [1]=casa [5]=mama)
$ echo ${Array[@]}
azar casa mama

E incrementando em cada um deles
$ Array+=([0]=ado [1]=mento [5]=mia)
$ echo ${Array[@]}
azarado casamento mamamia

Até a próxima com mais um da série "Porque não me falaram que era só apertar o botão?"



Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts