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

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


A diferença entre as crases (``) e o '$()'



Muitos se perguntam se a diferença de se usar as crases ou os parênteses para executar subcomandos é só a legibilidade da sintaxe.

A legibilidade é um dos fatores; mas não o único.

O fato é a que o segundo método, usando um cifrão ($) seguido do comando entre parêntese permite que você execute mais de um subcomando recursivamente.

"Como assim?"

Veja o exemplo. Deixo claro que é um exemplo ilustrativo. Não tem efetivamente sentido.

Como sabemos, o bash não sabe lidar com números reais; apenas inteiros. Então vamos utilizar a calculadora bc como auxiliar no cálculo com números reais:

Primeiramente definimos as operações:

Soma() # Soma de dois ou mais termos
{
        echo [email protected] | tr ' ' '+' | bc -l
}

Sub() # Subtração de dois ou mais termos
{
        echo $1-$2 | bc -l
}

Multi() # Multiplicação de dois ou mais termos
{
        echo [email protected] | tr ' ' '*' | bc -l
}

Div() # Divisão de dois termos
{
        echo $1/$2 | bc -l
}

$ X=$(Sub $(Multi $(Soma 2.5 $(Div 9 2)) 3.3) 0.5)
$ echo $X

22.60000000000000000000

Agora deixa eu explicar cada coisa que acontece acima.

Nas funções, o que é feito é o recebimento dos operandos como argumentos. No lugar dos caracteres espaço " ", colocamos o sinal referente à operação e e seguida enviamos para o bc, com o parâmetro -l, para que ele interprete números com ponto-flutuante.

Em seguida usamos as funções definidas para formarmos a sentença.

A grande sacada desta sintaxe é que os subcomandos mais internos são executados primeiro, como numa equação matemática que estamos acostumados, ou como na maioria das clássicas linguagens de programação.

"Mas isso que você fez eu posso fazer com o comando:

$ echo '((2.5+(9/2))*3.3)-0.5' | bc -l
22.60000000000000000000"

Sim, mas eu disse que era um exemplo meramente ilustrativo ;-)

Então você poderia utilizar estas funções para tarefas como calcular raízes de funções trigonométricas, dentre outras "inutilidades". rs

Agora a comparação com as conhecidas crases:

Algo como ...

X=`Sub `Multi `Soma 2.5 `Div 9 2`` 3.3` 0.5`

... não poderia ser interpretado corretamente pelo bash, simplesmente porque não há como saber onde começa e onde termina um subcomando. Para verificar isso, veja a crase após a palavra Sub. Será que ela é o "fechamento" da crase antes da palavra Sub ou inicia mais um subcomando?

Prova disso é o retorno do comando:

bash: 0.5: command not found
bash: 2.5Div: command not found

Mas isso não significa que as crases não sirvam para nada. Elas são muito úteis para quando estamos com pressa, como quando queremos entrar no diretório de módulos do kernel corrente. Tem coisa mais rápida que um "cd /lib/modules/`uname -r`/"?

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

Mudando o tema dos cursores do mouse no Linux

Ogle: O player de DVD

Rodando vídeos .rmvb no Linux

Instalando um ambiente leve e funcional em computadores antigos

Brincando com vetores - complemento

Leitura recomendada

Formatando o bash com cores e efeitos

Conectando-se à Internet via ADSL com PPPoE no OpenBSD

Automatização de backup

Coloque ordem em seus programas

Automatizando a conexão com Internet via ADSL com PPPoE no OpenBSD

  
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 eddye00 em 28/04/2014 - 18:17h

Didática muito boa, favoritado!


Contribuir com comentário