Pular para o conteúdo

Concatene com o Bash e fique contente!

Dica publicada em Shell Script / Variáveis
Leandro Santiago tenchi
Hits: 19.378 Categoria: Shell Script Subcategoria: Variáveis
  • Indicar
  • Impressora
  • Denunciar

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:

Criando um pacote com o kernel compilado para o Slackware

Seu Linux falando português nativamente

Framebuffer - recursos gráficos sem o X

Como preparar a compilação de um programa que utiliza Qt4

Obtendo CDs do Ubuntu no Brasil

Site com várias dicas de ajuda para shell script

Nome de arquivo com espaço dentro de variáveis

Somar variáveis nos shells BASH e sh

DictConv: Converta dicionários do Babylon para o StarDict

Como lidar com variáveis retornadas pelo Expect - removendo CR do fim de linha

#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

Entre na sua conta para comentar.