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: 44.701 ]

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

Instalando um ambiente leve e funcional em computadores antigos

Brincando com vetores - complemento

Rodando vídeos .rmvb no Linux

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

Assistindo vídeos no XMMS

Leitura recomendada

Alternância de GPU em notebooks Core-i

Xdialog - Programação Gráfica Útil

Linux com boot no Pendrive, com todas as facilidades: Smart-USB_Key-Mania, PLOP Boot Manager e outros métodos

Script "apagador de linhas"

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

  
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