Os operadores utilizados para cálculos com expressões lógicas, ou de álgebra booleana, são muito semelhantes aos utilizados em
C. Isto é citado porque muitos aprendem
C nos cursos técnicos e superiores como uma das primeiras linguagens, antes de se aprender Shell Script. Do contrário, o que adianta comparar
C e Shell Script, se não se sabe o primeiro?
Primeiros exemplos: cálculos do tipo maior, maior ou igual, menor, menor ou igual, igual e diferente. Aqui também o operador deve ficar entre aspas simples ou duplas, ou ainda com a barra invertida.
expr 4 \> 3
Retorna
1, pois 4 é maior que 3. O retorno 'um' significa verdadeiro em linguagem booleana.
Nota-se que o caractere ">" deve estar entre aspas ou com a barra invertida, pois o sistema pode interpretar como um redirecionamento. O mesmo vale para "<", para "|" e para "&". Estes dois últimos podem ser confundidos com um pipe ou com uma ordem de rodar um comando em background, respectivamente.
expr 4 \< 3
Retorna:
0. 'Zero' quer dizer falso em linguagem booleana, já que 4 não é maior que 3.
expr 4 != 3
Retorna:
1, porque 4 e 3 são diferentes.
expr 4 = 3
Retorna:
0, porque 4 e 3 são diferentes. Agora se for testado:
expr 4 = 4
Retorna:
1, portanto verdadeiro. Logo:
expr 4 != 4
Retorna:
0, portanto, falso.
expr 4 \>= 3
Retorna:
1, porque 4 é maior ou igual a 3.
expr 4 \<= 3
Retorna
0, porque 4 não é maior ou igual a 3.
Esses exemplos com números são estranhos, 4>3. A utilidade fica mais evidente com variáveis: ax=10
expr $ax '=' 10
Retorna:
1
expr $ax '>' 9
Retorna:
1
expr $ax '<' 8
Retorna:
0
Ainda há a comparação de strings. Funciona de modo semelhante à função "strcmp(") da linguagem
C. Se testarmos:
expr abcde = abcde
Retorna:
1, porque obviamente são iguais.
expr abcde != abcdf
Retorna:
1, porque obviamente são diferentes.
expr abcde \< abcdf
E agora? Retorna
1, porque a letra f está uma posição à frente da letra e a string, portanto, é interpretada como maior. O mesmo ocorre com:
expr abcde \<= abcdf
Pois é menor ou igual. No caso de strings de tamanho diferentes:
expr abcde \<= abcdef
Retorna:
1, ocorre o mesmo.
expr abcde \>= abcdef
Retorna:
0
expr 'A' \> 'a'
Retorna:
1
Depois destes seis operadores, ainda pode-se mencionar mais dois operadores: "|" e "&".
Falando sobre o operador "|", seja a expressão:
a1 | $b1
O cálculo efetuado por
expr retorna
$a1, se "$a1" não é nem conteúdo nulo nem 0, caso contrário, retorna o valor de
$b1.
Exemplos: sejam os seguintes valores atribuídos às variáveis:
a1='a'
a2='b'
a3=''
a4='0'
Seguem os resultados dos cálculos:
expr $a1 \| $a2
Retorna:
a
expr $a2 \| $a1
Retorna:
b
expr $a1 \| "$a3"
Retorna:
a. Por "$a3" ter um valor nulo, deve ser colocada entre aspas duplas. Isto indica que é uma boa deixar os valores entre aspas no script, no caso de algum deles estar em branco e interromper o funcionamento do mesmo.
expr "$a3" \| $a1
Retorna:
a
O mesmo citado anteriormente vale sobre as aspas, melhor dizendo, sobre aspas duplas. Aspas duplas permitem interpretação do valor. Aspas simples transformam a variável em uma string contendo seu próprio nome. Assim "$a4" é igual a 0, e '$a4' é igual a simplesmente $a4.
expr $a1 \| $a4
Retorna:
a
expr $a4 \| $a1
Retorna:
a
expr "$a3" \| $a4
Retorna:
0
expr $a4 \| "$a3"
Retorna:
0. Logo 0 tem precedência sobre uma string nula.
Agora, sobre o operador "&": seja a expressão:
a1 & $b1
O cálculo efetuado por
expr retorna
$a1, se nenhum argumento for nulo ou igual a 0, caso contrário retorna 0. Exemplos: sejam os seguintes valores atribuídos às variáveis
a1='a'
a2='b'
a3=''
a4='0'
Seguem os resultados dos cálculos:
expr $a1 \& $a2
Retorna:
a
expr $a2 \& $a1
Retorna:
b
expr $a1 \& "$a3"
Retorna:
0. Ler a citação no outro exemplo do operador "|" sobre as aspas duplas.
expr "$a3" \& $a1
Retorna:
0
expr $a1 \& $a4
Retorna:
0
expr $a4 \& $a1
Retorna:
0
expr "$a3" \& $a4
Retorna:
0
expr $a4 \& "$a3"
Retorna:
0. Repetindo: 0 tem precedência sobre uma string nula.
Os operadores "|" e "&" guardam uma grande semelhança com as opções de linha de comando "||" e "&&" do BASH:
- Se a primeira opção do comando '|' falhar, isto é nulo ou zero, ele envia o valor do segundo parâmetro, igual a quando o comando que precede o '||' falha. Quando falha, é executado o segundo comando, senão, nada feito.
- Se a primeira opção do comando '&' falhar, isto é nulo ou zero, ele envia o valor zero e nem envia o valor do segundo, igual a quando o comando que precede o '&&' falha. Se o segundo falhar, também acusa erro, ou zero.
Para finalizar: não existe operador de 'ou exclusivo' usável na sintaxe do
expr. Seria possível efetuar este cálculo, se existisse um operador de negação lógica, através da combinação deste operador com os operadores "|" e "&".