É sabido que o bash não têm "variáveis booleanas", como as utilizadas em linguagens mais tradicionais. Isso não é exatamente uma limitação, pois ele nos oferece recursos para implementarmos estes tipos, como mostrarei adiante.
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.
Primeiramente devo frisar que já existe, no unix, essa "implementação". São dois programas chamados true e false. true retorna 0 e false, 1.
Mas se, repentinamente estes dois arquivos fossem deletados, como recriá-los? Uma maneira é reescrevermos estes programas.
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
halt(1);
end.
Pronto! Basta compilá-los, jogá-los num local qualquer da variável PATH e beleza.
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
> }
Básico, e mais rápido, por já estar na memória durante toda a execução do script.
Para utilizar estes recursos em nossos scripts, utilizamos atribuições normais:
$ bool1=true
$ boll2=false
$ if $bool1 || $bool2
> then
> echo Um dos dois é verdadeiro
> fi
Aí você pode inventar à vontade, utilizando expressões mais complexas:
$ while ( ! $bool1 && ( $bool2 || $bool3 )) || ( $bool4 || ! $bool5 ) ) && ((i>50))
> do
> echo "eita negócio esquisito..."
> done
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.
Já que estamos no embalo, vamos implementar uma função que devolve o inverso do valor lógico de uma variável:
$ 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 ))
> }
É tiro e queda. ;-)