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.967 ]

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


Declaração Condicional de Funções



O primeiro deles eu não sei o nome, mas acho que posso chamar de "declaração condicional de funções". O nome pode parecer chato, mas darei um exemplo para vocês entenderem.

Imaginem que você tem um script, digo, programa, que é capaz de se apresentar para o usuário usando diferentes interfaces.

O que eu quero exatamente. Um programa que execute as seguintes ações:

LerDadosDoUsuario Idade "Digite sua idade"
if ((Idade>=18))
then
   Escreva "Você é Maior de Idade. Pode passar"
else
   Escreva "Você é menor de idade. Sai pra lá, pivete"
fi

A questão é: no lugar da chamada "LerDadosDoUsuario" eu poderia ter dado um 'echo "Digite sua idade"; read Idade', por exemplo. Mas o questão aqui é sermos o mais flexíveis possível, não é? Afinal, se quiséssemos que este programa fosse apresentado numa interface mais amigável, como em dialog ou Xdialog, teríamos que que modificar o código todo!

Para resolver isso, podemos fazer o seguinte: precisaremos primeiramente de um flag. Uma variável que nos diga se deveremos usar uma interface em dialog ou em modo texto mesmo.

Ela pode ter o valor "true", se vai usar dialog, ou "false", se será na base do echo mesmo.

if $USEDIALOG # flag
then
   function LerDadosDoUsuario()
   {
      DadoLocal=$(dialog --inputbox "$2" 0 0  --stdout)
      eval $1=\"$DadoLocal\"
   }


   function Escreva()
   {
      dialog --infobox "$1" 0 0
   }
else
   function LerDadosDoUsuario()
   {
      echo "$2"
      read DadoLocal
      eval $1=\"$DadoLocal\"
   }
  
   function Escreva()
   {
      echo $1
   }
fi

Desta forma, você poderia utilizar as funções Escreva e LerDadosDoUsuario quantas vezes quisesse no programa e, para modificar a interface do programa todo, bastaria modificar algumas poucas linhas!

É claro que muitas vezes não é conveniente que todo esse código fique no mesmo arquivo que o núcleo do programa. Você poderia deixar as funções de cada interface em arquivos diferentes, como no exemplo:

if $USEDIALOG
then
   source interfaces/dialog.sh
else
   source interfaces/cli.sh
fi

Neste caso, as funções referentes à interface em dialog ficariam no arquivo "source interfaces/dialog.sh" e as em modo texto ficariam em "interfaces/cli.sh".

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

Ogle: O player de DVD

Mudando o tema dos cursores do mouse no Linux

Brincando com vetores - complemento

Assistindo vídeos no XMMS

Brincando com vetores

Leitura recomendada

Backup em HDs da rede

Impressora PDF via Samba para estações Windows

Enviando mensagens para usuários da rede

Desinstalando todos os programas instalados a partir de uma data específica

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

  
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