Alguns recursos do BASH para você utilizar em seus programas

Neste artigo mostrarei alguns recursos úteis para os amantes de shell-script, mas que não querem escrever somente scripts, e sim verdadeiros e complexos programas.

[ Hits: 45.146 ]

Por: Leandro Santiago em 07/02/2008 | Blog: http://leandrosan.wordpress.com


Como criar programas internacionalizáveis



Mais um com nome comprido ;-)

A idéia aqui é fazer programas que possam ser facilmente traduzidos para qualquer idioma, sem que você tenta que necessariamente "botar a mão" no código.

Mas o que seria exatamente traduzir um programa? Ora, não seria necessário aqui traduzir o código, mas somente aquilo que é visível ao usuário, ou seja, a interface.

Inicialmente pensei em simplesmente transformar cara string (texto de interface) numa variável, mas percebi que não funcionaria.

Acompanhe meu exemplo:

MENSAGEMHELLOWORLD="Olá, esta é uma mensagem de Hello Wold".

Escreva "$MENSAGEMHELLOWORLD"

Até agora funcionaria bem, pois a mensagem é bem simples.

Mas vamos supor que quisesse escrever uma mensagem que envolvesse alguma outra variável, que pudesse ter seu valor modificado:

ANO=2007

MENSAGEMDEANO="Olá, nós estamos no ano de $ANO. Daqui há um ano será $((ANO+1))."

ANO="1997"

Escreva "$MENSAGEMDEANO"

Ele provavelmente exibiria algo como:

"Olá, nós estamos no ano de 2007. Daqui há um ano será 2008."

E não...

"Olá, nós estamos no ano de 1997. Daqui há um ano será 1998."

... que é o que queremos.

Como resolver isso? Queremos que as variáveis da mensagem sejam definidos no exato momento da chamada da mensagem, e não na sua declaração. Alguma idéia?

Sim! Vamos usar funções! Eu adoro funções. Você não? ;-)

Vamos declarar a mensagem de uma maneira diferente:

MENSAGEMDEANO() { echo "Olá, nós estamos no ano de $ANO. Daqui há um ano será $((ANO+1))."; }

Assim, podemos chamar a função Escreva da seguinte forma:

Escreva $(MENSAGEMDEANO)

Ou a chamada da função pode aparecer no meio de outra string:

Escreva "Esta é uma mensagem: \"$(MENSAGEMDEANO)\", entendeu?"

Que funcionará muito bem, embora seja ruim do ponto-de-vista de desempenho.

Agora a primeira pergunta: Porque escrever a função da mensagem em uma linha?

A resposta é: Assim fica muito mais fácil para alguém que for traduzir o programa para outro idioma ver que aquilo é uma mensagem, e não precisa saber que se trata de uma função!

O que você fazer? Colocar todas as declarações das mensagens num arquivo em separado, que teria o seu conteúdo da seguinte forma:

# Tradução do programa tal-tal-tal para emuxês

# "Deseja formatar o computador $COMPUTERNUM?"
MSGFORMATE() { echo "Disejah FOrMaTaH u kOmpUTAdor $COMPUTERNUM???"; }

# "A instalação foi abortada. Por favor verifique o arquivo $LOGFILE para mais informações"
MSGABORTINSTAL() { echo "A instALAXXaUM FoI AbOrtaDEenhah...... poR FaVor vEriFIKe u ARkIVu $LOGFILE prAH + InfORmAXXoexXx"; }

# Créditos das mensagens ao Aurélio e seu Miguxeitor: http://aurelio.net/web/miguxeitor.html ;-)

Assim, a pessoa que traduzisse seu programa precisaria somente modificar o que está entre aspas!

E, no início do seu programa haveria algo como:

LANGUAGE=emuxes_pt_BR

source languages/${LANGUAGE}.sh

Só acrescentando uma informação: Procurei utilizar aqui somente ferramentas nativas do bash, embora seja possível utilizar a ferramenta gettext para criar programas internacionalizáveis em shell-script também. Mas acredito que isto seja assunto para outro artigo. Quem sabe o próximo?

Página anterior     Próxima página

Páginas do artigo
   1. Introdução
   2. Declaração Condicional de Funções
   3. Como criar programas internacionalizáveis
   4. Como criar programas com opções - melhorado
   5. A diferença entre as crases (``) e o '$()'
   6. Curiosidades sobre a aritmética do bash
   7. Conclusão, referências e todo o resto
Outros artigos deste autor

Assistindo vídeos no XMMS

Brincando com vetores

Mudando o tema dos cursores do mouse no Linux

Recursos avançados do bash que você não aprende na escola

Ogle: O player de DVD

Leitura recomendada

Fazendo o bash contar piadas

Configurando OpenSSH no Windows Server 2003 para autenticação por chave (sem senha)

KeepAlive para conexão discada (ou não)

Conectando-se à Internet via ADSL com PPPoE no OpenBSD

Brincando com vetores - complemento

  
Comentários
[1] Comentário enviado por hugoeustaquio em 07/02/2008 - 18:03h

"Eu havia dito que expressões como ((1<2)) retornam verdadeiro para o shell. A questão é: porque isto acontece? "

Isso acontece porque 1 é menor que 2 ;)

Viva o bash!

[2] Comentário enviado por tenchi em 07/02/2008 - 20:00h

Ah hugoeustaquio, não é que você está certo? rsrs
Acabei dizendo tal bobagem para mostrar que algumas operações do bash se assemelham muito às de linguagens como C, onde 1 é verdadeiro e 0, falso. O problema é que muitas pessoas simplesmente desconhecem tais recursos.
Mas valeu pela correção ;-)

[3] Comentário enviado por chimico em 08/02/2008 - 09:53h

Muito bom, parabéns pelo artigo!

[4] Comentário enviado por k4mus em 08/02/2008 - 09:59h

Parabens amigo. A algum tempo q eu procurava algum material como este.

vlw

[5] Comentário enviado por everton3x em 08/02/2008 - 11:57h

Muito bom artigo, não tanto por mostrar como fazer "algumas coisinhas" com Shell Script, mas principalmente por mostrar aos pagãos o quão poderoso é o bash.
Parabéns!

[6] Comentário enviado por juliaojunior em 08/02/2008 - 18:26h

muito bom. Direto para favoritos. :>

[7] Comentário enviado por Teixeira em 09/02/2008 - 22:15h

Gostei muito do artigo.
Eu mesmo tinha outra idéia do assunto, pois achava que a coisa seria muito complicada.
O amigo veio provar o contrário.
Pode ser complexo no início, e exige grande disciplina, mas certamente complicado não é.
( Normalmente é a verbose que assusta um pouco )
Parabéns !

[8] Comentário enviado por elgio em 22/02/2008 - 15:24h

Sobre a arimetica um cuidado deve ser tomado ao escrever os numeros:

$ echo $(( 9 < 011 ))
0


Ué? 9 é menor que 11, então porque a expressão deu FALSO? (valor 0)

Porque números precedidos com ZERO são interpretados como octal pelo BASH e 011 octal = 9 em decimal:

$ echo $(( 9 == 011 ))
1

[9] Comentário enviado por elgio em 22/02/2008 - 15:30h

A propósito: legal este teu artigo.
Cheio de manhas.

[10] Comentário enviado por removido em 28/04/2014 - 18:17h

Didática muito boa, favoritado!


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts