Pequenos Comandos, Grandes Ações: Expr

Conheça detalhes do comando expr, que possui 1.001 utilidades, assim como o Bombril®!

| Se você apoia nosso site, desative o AdBlock quando visitá-lo, inclusive em Mobile!
Os anúncios são poucos e não invasivos. Se quiser contribuir com nosso trabalho, clique em qualquer banner de sua preferência, exceto dos Parceiros. 
Mais detalhes clicando aqui.

PCGA: Pequenos comandos, grandes ações!

Dando continuidade aqui no site dessa série que foi um sucesso na página homônima no Facebook, trago comandos simples, a maioria deles curtos com parâmetros diretos, que podem agilizar seu trabalho como sysadmin de qualquer sistema baseado em UNIX. Comandos como ls, mkdir, chmod, etc são descritos em toda sua glória e praticidade, para enriquecer seu leque de possibilidades de uso para com o Terminal, seja ele qual for, de qual distro Linux você utilizar.

Expr

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.

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

Para o uso de asterisco, deve-se colocar o operador entre aspas simples ou duplas. Os operadores e os parêntesis também podem ser usados colocando a barra invertida \. Isso evita que o shell tente interpretá-los como meta-caractere.

Outro exemplo:

$ expr 5 '*' 4

Retorna: 20

O mesmo exemplo vale para demais calculos matemáticos. Porém o Expr não calcula raíz ou potências; isso demonstra limitações algébricas que podem ser sanadas com o uso do comando BC!
Mas falarei do BC em outro post.

Expressões Lógicas

A seguir a aplicação de expressões lógicas com o comando expr:

Exemplo  1:

$ expr 4 \> 3

Retorna: 1

A barra invertida protegendo o símbolo > para evitar que seja interpretado pelo Shell.
O resultado é 1, pois 4 é maior que 3.
O retorno ‘um’ significa verdadeiro em linguagem booleana.

Exemplo 2:

$ expr 4 != 3

Retorna: 1, porque 4 e 3 são diferentes.
Sendo 1 = verdadeiro

Exemplo 3:

$ expr 4 = 3

Retorna: 0, porque 4 e 3 são diferentes.
Sendo 0 = falso

Ainda há a comparação de strings.
Funciona de modo semelhante à função “strcmp()” da linguagem C.
Dessa forma:

$ expr abcde = abcde

Retorna: 1, porque obviamente são iguais.

Exemplo 2:

$ expr abcde != abcdf

Retorna: 1, porque obviamente são diferentes.

Exemplo 3:

$ 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.

Observação:

Os operadores “|” e “&” possuem 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.

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 “&”.

Expressões Regulares e Strings

Após a demonstração do comando expr com expressões numéricas e lógicas, falta apresentar como ele trabalha com expressões regulares. No lugar de operadores, os procedimentos usam palavras-chave. Exceto por um uso de “:” como um operador. Os dois pontos realizam uma busca por um padrão assim como a palavra-chave “match”.

Palavras-chave permitidas:

  • + STRING :: interpreta o que vem depois de “+” como uma string, mesmo sendo palavra reservada ou um dos operadores.
  • STRING : REGEX :: realiza uma busca em STRING usando por padrão REGEX.
  • match STRING REGEX :: o mesmo que o anterior STRING : REGEX.
  • substr STRING POSIÇÂO TAMANHO :: pega um pedaço de STRING a partir de POSIÇÃO e com TAMANHO como número de caracteres. Não aceita parâmetros negativos.
  • index STRING CHARS :: retorna em qual posição de STRING foi encontrado o caractere CHARS.
  • length STRING :: conta a quantidade de caracteres presentes em STRING.

Exemplos com o operador “:” e com a palavra “match”:

$ expr A\ ligeira\ raposa\ marrom\ saltou\ sobre\ o\ cão\ preguiçoso : ^[^a]

Ou:

$ expr match A\ ligeira\ raposa\ marrom\ saltou\ sobre\ o\ cão\ preguiçoso ^[^a]

Ambas retornam: 1

Como a regex pede que o primeiro caractere seja diferente de “a” (minúsculo) e o primeiro caractere da string não é um “a” (minúsculo), o retorno é 1, ou seja, verdadeiro para este padrão regex. Se não usar a palavra-chave “match”, usa-se a sintaxe com dois pontos.

Além disso, a frase está com barras invertidas antes dos espaços em branco. Sem elas, o expr faria confusão e pensaria que há vários parâmetros na linha de comando.

Para usar melhor esta opção, recomendo um aprofundamento em regex. Isto foge do foco deste artigo.

Exemplo com a palavra-chave substr:

$ expr substr A\ ligeira\ raposa\ marrom\ saltou\ sobre\ o\ cão\ preguiçoso 18 6

Retorna: marrom

$ expr substr A\ ligeira\ raposa\ marrom\ saltou\ sobre\ o\ cão\ preguiçoso 17 6

Retorna: marrom

Na verdade, ele retorna como primeiro caractere um espaço em branco seguido da palavra marrom, porque a posição 17 da string é um caractere em branco. Para pegar a palavra “marrom” com este caractere em branco, seria necessário os parâmetros “17 7” por causa do tamanho da substring.

Exemplos com a palavra-chave “index”:

$ expr index "A ligeira raposa marrom saltou sobre o cão preguiçoso" z

Retorna: 0, pois a string não possui a letra z.

Exemplo 2:

$ expr index "A ligeira raposa marrom saltou sobre o cão preguiçoso" m

Retorna: 18, pois na string a primeira ocorrência da letra m ocorre na posição 18.

Finalizando, a palavra chave length contabiliza a quantidade de caracteres:

$ expr length "isso é um teste"

Retorna: 15
Pois contabiliza também os espaços!

Conclusão

Hoje vocês viram como faz uso de expressões com o comando expr, para as mais diversas situações. Recomendo que olhem o “man” do expr:

$ man expr

Apesar da má fama dos manuais via terminal, o man do expr mostra muitos exemplos e usos das strings disponíveis para o comando de forma organizada e direta.

#UrbanCompassPony

Fonte:
Bombril® é uma marca registrada da Abrasivos Bombril Ltda.
VivaOLinux 1
VivaOLinux 2

Deixe um comentário