Escolar Documentos
Profissional Documentos
Cultura Documentos
Para quem não sabe, no bash, não é obrigatório o uso do programa test para
comparação de variáveis. Digo isso pois todo mundo aprende, nos mais
diversos tutoriais que encontramos na internet, a fazer comparações com o
uso deste programa. Qual o problema disso?
Mostrar uma sintaxe mais limpa para tais operações, a fim de tornar o
código muito parecido com o mesmo código em linguagens como
c/c++.
Tornar a execução do programa mais rápida (se bem que, como
estamos falando de shell-script, isso não faz muita diferença).
$ i=$RANDOM
$ j=$RANDOM
$ if [ $i -eq 20 -o $j -eq 30 ]
> then
> echo I é igual a vinte ou J é igual a 30
> fi
$ if [ $i -eq 20 ] || [ $j -eq 30 ]
> (...)
1 de 10 10-12-2010 22:47
Recursos avançados do bash que você não aprend... http://www.vivaolinux.com.br/artigos/impressora....
$ i=$RANDOM
$ j=$RANDOM
$ if (( ( i == 20 ) || ( i == 20 ) ))
> then
> echo I é igual a vinte ou J é igual a 30
> fi
$ if (( i == 20 )) || (( i == 20 ))
> (...)
incrementar variáveis:
$ incremento=2
$ i=1
$ (( i+=incremento )) ## isso acrescenta 2 à variável i, que fica com o
valor 3
O mesmo vale para operações como subtração (/), multiplicação (*) e módulo
(%). Ou se você quiser, simplesmente, adicionar 1 à variável, use:
$ ((i++)) # pós-incremento
$ ((++i)) # pré-incremento
$ ((i--)) # pós-decremento
$ ((--i)) # pré-decremento
2 de 10 10-12-2010 22:47
Recursos avançados do bash que você não aprend... http://www.vivaolinux.com.br/artigos/impressora....
$ (( i = (j%20)+1 ))
$ if (( ${#i} == 0 ))
> then
> echo a variável i não está definida
> fi
Essa eu descobri esses dias: o bash utiliza mais de uma base numérica, que
não seja a decimal.
Quando um número começa com zero (ex: 012), ele é utilizado como tendo
base octal. Assim, 012 em octal equivale à 10 em decimal.
$ if ((012==10))
> then
> echo 'Isso é igual?!!!!'
> fi
Isso é igual?!!!!
Quando um número começa com 0x, sua base é hexadecimal. Assim, por
exemplo, 0xf é igual à 15.
$ ((i=0xf))
$ echo $i
15
A sintaxe é: (([base]#valor))
3 de 10 10-12-2010 22:47
Recursos avançados do bash que você não aprend... http://www.vivaolinux.com.br/artigos/impressora....
Lembrando que não pode haver nenhum algarismo no valor que seja maior
que a base (ex: não existe o valor 3 em binário, que só aceita dois "tipos de
símbolos": 0 e 1):
$ echo $((2#3))
bash: 2#3: value too great for base (error token is "2#3")
Obs: Quando a base é maior que dez, usa-se letras para complementar. Ex:
$ echo $((20#kk))
440
Ou seja, se alguém te disse que algo custa R$ Wf@3, não chame ela de
louca. Pergunte qual base numérica está utilizando!
Laços de repetição
Tá, todo mundo sabe que existem centenas de formas de utilizar um for no
bash. O legal é que a maneira aritmética dele é bem parecida com a sintaxe
em C:
$ for ((i=0;i<10;i++))
> do
> echo $i
> done
4 de 10 10-12-2010 22:47
Recursos avançados do bash que você não aprend... http://www.vivaolinux.com.br/artigos/impressora....
digite: 9
0
digite: 7
1
digite: 8
2
digite: 6
3
digite: 3
4
digite: 1
5
digite: 4
6
digite: 5
z vale = -7
O que esse código faz? Ele lê o valor de j, inicializa i com zero, e enquanto i
for menor ou igual a 20 E j for diferente de 5, ele lê j do usuário e
incrementa i e decrementa z. No final, exibe o valor de z. Fantárdigo!!!
$ i=20
$ j=15
$ echo $(( i < j ? 1 : 2 ))
2
O que isso significa? Se i for menor que j, retorna (imprime por causa do
echo) 1, senão retorna 2. Neste caso retorna 2, pela primeira operação ser
falsa.
Outra sacada legal é uma outra sintaxe do laço for. Todo mundo aprende o
5 de 10 10-12-2010 22:47
Recursos avançados do bash que você não aprend... http://www.vivaolinux.com.br/artigos/impressora....
for assim:
$ for ((i=0;i<10;i++))
> do
> echo $i
> done
$ for ((i=0;i<10;i++))
>{
> echo $i
>}
$ until ((i==10)); do echo 'Só vou sair se você digitar 10!!!'; read i;
done
$ while ((i==10)); do echo 'Não saio enquanto você digitar 10!!!!';
read i; done
6 de 10 10-12-2010 22:47
Recursos avançados do bash que você não aprend... http://www.vivaolinux.com.br/artigos/impressora....
Utilizando booleanos
Mas basicamente, o que é uma variável booleana? É algo que diz de algo deu
ou não certo. E o bash já faz isso. Nós só vamos formalizar e deixar as coisas
mais simples para o uso cotidiano.
Mostro aqui como fazê-lo nas linguagens c e pascal, mas não é nem
necessário dizer que você poderia fazer o mesmo em qualquer outra
linguagem.
Em c:
// Programa true:
int main()
{
return 0;
}
// Programa false:
int main()
{
return 1;
}
Em pascal (fpc):
// Programa true:
program verdadeiro;
begin
halt(0);
end.
// Programa false:
program falso;
begin
7 de 10 10-12-2010 22:47
Recursos avançados do bash que você não aprend... http://www.vivaolinux.com.br/artigos/impressora....
halt(1);
end.
Mas como o negócio aqui é evitar buscar arquivos externos ao bash, vamos
fazer a mesma implementação em bash-script:
$ true()
>{
> return 0
>}
$ false()
>{
> return 1
>}
$ bool1=true
$ boll2=false
$ if $bool1 || $bool2
> then
> echo Um dos dois é verdadeiro
> fi
Isso é útil também quando você faz um script com "chaves liga-desliga". Não
precisa fazer comparação alguma. Basta um if com uma variável booleana, e
tudo está feito. Simples e rápido, lembrado a linguagem humana.
8 de 10 10-12-2010 22:47
Recursos avançados do bash que você não aprend... http://www.vivaolinux.com.br/artigos/impressora....
$ Not()
>{
> $1 && echo false || echo true
>}
$ variavel=false
$ for i in `seq 1 5`
> do
> echo $variavel
> variavel=`Not $variavel`
> done
false
true
false
true
false
Você pode, por exemplo, implementar uma função "Talvez", muito útil nos
dias de hoje:
$ Talvez()
>{
> return $(( RANDOM % 2 ))
>}
Agradecimentos e referências
Quero dizer também que isso não é tudo. O bash é mais complexo e
completo do que pensamos. Mas uma boa pesquisa resolve qualquer
problema.
Referências:
9 de 10 10-12-2010 22:47
Recursos avançados do bash que você não aprend... http://www.vivaolinux.com.br/artigos/impressora....
http://www.gnu.org/software/bash/manual/bashref.html
Site do Júlio Neves: http://www.julioneves.com/
Site do Aurélio: http://www.aurelio.net/
Site do Thobias: http://thobias.org/
Google: http://www.google.com/
Muitos outros que precisariam de uma lista muito grande ;-)
Até a próxima.
http://www.vivaolinux.com.br/artigo/Recursos-avancados-do-bash-que-voce-
nao-aprende-na-escola
10 de 10 10-12-2010 22:47