[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
- Dica: Concatene com o bash e fique contente!,
Leandro Santiago da Silva <=