expr - Definição e uso do comando

Neste artigo será apresentado o comando expr. Este comando é utilizado para cálculos feitos em linha de comando em Shell Scripts. Funciona com expressões numéricas, expressões lógicas ou expressões regulares e Strings.

[ Hits: 12.814 ]

Por: Perfil removido em 29/06/2015


Cálculos com expressões lógicas



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 "&".

Página anterior     Próxima página

Páginas do artigo
   1. Introdução
   2. Cálculos com expressões lógicas
   3. Cálculos com expressões regulares e strings
   4. Resumo e revisão
   5. Saída de erros
Outros artigos deste autor

Formatação de linhas e colunas da planilha do OpenOffice

Uma "fábula" sobre acessar e mapear unidades de rede do Windows no Linux

Fingerprint-GUI (solução para leitores biométricos) no Ubuntu

Ingressar desktop GNU/Linux no domínio Active Directory do Windows Server 2008

Slackware - Instalação com Tagfiles

Leitura recomendada

Shell - Funções

Introdução ao Shell Script

Programando em shell script (conceitos básicos)

Programação com Shell Script

Personalize seu shell na entrada de seu logon

  
Comentários
[1] Comentário enviado por fabio em 29/06/2015 - 16:29h

Muito bom o artigo! Esse comando é uma mão-na-roda.

[2] Comentário enviado por morvan em 06/07/2015 - 11:06h

Bom dia.
Excelente artigo. Ferramenta muito útil, ainda que pouquíssimo conhecida | utilizada; eu a utilizo, por exemplo, em scripts (claro) e também quando preciso calcular tamanho de partições (normalmente, os CD de Recuperação são muito parcimoniosos de ferramentas, como calculadora, gráfica, no caso, daí recorro ao Console do Sistema).
Morvan, Usuário GNU-Linux #433640. Seja Legal; seja Livre. Use GNU-Linux.

[3] Comentário enviado por removido em 09/07/2015 - 02:50h

Obrigado a todos.

Faltou uma coisa: o limite dos cálculos numéricos é apenas até números de 64 bits, positivos e negativos, com bit identificador de sinal.
--
http://s.glbimg.com/po/tt/f/original/2011/10/20/a97264_w8.jpg

Encryption works. Properly implemented strong crypto systems are one of the few things that you can rely on. Unfortunately, endpoint security is so terrifically weak that NSA can frequently find ways around it. — Edward Snowden


Contribuir com comentário