shell-script-pt
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Dica: Concatene com o bash e fique contente!


From: Leandro Santiago da Silva
Subject: Dica: Concatene com o bash e fique contente!
Date: Thu, 13 Mar 2008 14:51:31 -0300
User-agent: Thunderbird 2.0.0.12 (X11/20080213)

Olá amigos Shelleiros.
Aqui vai uma dica no mínimo interessante de um recurso bacaninha do nosso colega bash, mas que quase não é difundido.

Trata-se da concatenação de strings e arrays (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 vêem, 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 " ".
Eu, visando contornar este problema, passei a utilizar o seguinte método:

# 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 (( ))"

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? Eu seria muito burro se acreditasse nisto. O que acontece é que o caractere 1 é adicionado no final da variável i!.

Faço então o seguinte teste:
$ for ((;i<10;i++)); do j+=$i; done

E exibo j:
$ echo $j
10123456789

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 um elemento no final do vetor:
$ Vetor+=( "a e i o u" ) # com espaço ou não, tanto faz.

E exibo o conteúdo de Vetor:
$ echo ${Vetor[@]}
a b c d á r i o a e i o u

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

E por hoje é isto pessoal. Espero que estes recursos os ajudem muito na construção de novos scripts e facilitação de novas implementações.

Eu às vezes publico alguns artigos interessantes (com assuntos pouco conhecidos mas muito úteis) sobre shell script no site VivaoLinux. Para quem quiser, acesse pelo endereço: http://www.vivaolinux.com.br/~tenchi <http://www.vivaolinux.com.br/%7Etenchi>


Leandro Santiago
http://leandrosan.wordpress.com


reply via email to

[Prev in Thread] Current Thread [Next in Thread]