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.
Introdução
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.
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.
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.