O comando
expr está presente no conjunto de utilitários
coreutils da GNU. Assim como o comando
bc, com certas diferenças, pode ser utilizado para cálculos feitos em linha de comando. Ele pode efetuar cálculos com expressões numéricas inteiras, expressões lógicas (ou booleanas), expressões regulares (regex) e strings.
Ele não é completo como a calculadora de mesa
bc, portanto, possui algumas limitações, como cálculos com frações, mas é suficiente em recursos para Shell Script.
Neste artigo, serão apresentados exemplos que ilustram como este simples comando pode ser poderoso e quais os usos que podem ser feitos com sua sintaxe.
Cálculos com expressões numéricas
Os cálculos são feitos usando-se uma sintaxe simples. Obedece à sintaxe de precedência das velhas expressões numéricas (primeiro parêntesis, depois multiplicação e divisão, por último adição e subtração) aprendidas nos primeiros anos da escola.
A sintaxe pede que seja deixado um "espaço em branco" entre o número e o operador, para que estes não sejam interpretados como uma String.
Por exemplo:
expr 5 + 4
Retorna:
9
expr 5 - 4
Retorna:
1
expr 5 * 4
Retorna erro.
A partir daqui percebe-se que deve-se colocar o operador entre aspas simples ou duplas, mesmo o operador + e o operador - que não apresentou este erro. Os operadores e os parêntesis também podem ser usados colocando a barra invertida
\.
expr 5 '*' 4
Retorna:
20
Também pode ser escrito com:
expr 5 \* 4
E também retorna:
20
Parêntesis também devem estar com aspas simples ou duplas, ou com a barra invertida. Sem o uso de um ou de outro, é acusado erro.
expr '(' 5 '+' 4 ')' '*' 2
Retorna
18, porque os cálculos dentro de parêntesis são prioridade.
Agora sem os parêntesis:
expr 5 '+' 4 '*' 2
Retorna
13, porque a operação
* tem a precedência sobre a operação
+.
E o que ocorre nas divisões não-exatas?
expr 15 '/' 4
Retorna
3, que é a parte inteira deste quociente. O operador
/ não apresentou erro quando foi usado sem aspas.
Apesar de não operar com decimais (para isto é melhor o comando
bc), opera com inteiros negativos:
expr -5 '*' -4
Retorna:
20
Também opera módulo (resto de divisão inteira):
expr 15 '%' 4
Retorna:
3
Ainda há uma diferença na operação de módulo se forem usados valores negativos:
expr -15 % 4
Retorna:
-3
expr -15 % -4
Retorna:
-3
expr 15 % -4
Retorna:
3
Concluindo: pode-se dizer que
expr não faz cálculos de exponenciação, nem de raiz quadrada ou outra raiz, nem frações decimais ou em outra base. Para isto, é melhor usar o comando
bc.