Fazendo aritmética em scripts de shell

27 27America/Sao_Paulo dezembro 27America/Sao_Paulo 2017 Off Por Sidney silva santos

O bash usa variáveis não tipadas, o que significa que normalmente ele trata variáveis como strings ou texto, mas pode alterá-las no processo, se quiser. A menos que você diga a ele de outra maneira com declare, suas variáveis são apenas um monte de letras para o bash. Mas quando você começar a tentar fazer aritmética com elas, o bash as converte para números inteiros, se puder. Isso torna possível fazer alguma aritmética  relativamente complexa em bash.

Uma das função que dá pra usar é o let  veja como usar essa função:

  id++, id-- pós-acréscimo, pós-decréscimo de variável
  ++id, --id pré-acréscimo, pré-decréscimo de variável
  -, + menos, mais unário
  !, ~ negação lógica e bit-a-bit
  ** exponenciação
  *, /, % multiplicação, divisão, resto de divisão
  +, - adição, subtração
  <<, >> deslocamento bit-a-bit para esquerda, direita
  <=, >=, <, > comparação
  ==, != igualdade, desigualdade
  & E (AND) bit-a-bit
  ^ OU eXclusivo (XOR) bit-a-bit
  | OU (OR) bit-a-bit
  && E lógico
  || OU lógico
  expr ? expr : expr operador condicional
  =, *=, /=, %=,
  +=, -=, <<=, >>=,
  &=, ^=, |= atribuição

Agora vou mostrar tudo isso em um script só mesmo pra ver como tudo isso funciona.

[caption id="attachment_978" align="aligncenter" width="451"]Script usando a função let Exemplos usando a função let[/caption] [caption id="attachment_979" align="aligncenter" width="451"]Script shell Saida do script[/caption] [caption id="attachment_980" align="aligncenter" width="451"]Script shell Segundo exemplo da função let[/caption] [caption id="attachment_981" align="aligncenter" width="451"]Script shell Saida do script[/caption] [caption id="attachment_982" align="aligncenter" width="451"]Shesll script Exemplo de comparação e exponenciação usando a estrutura if[/caption] [caption id="attachment_983" align="aligncenter" width="451"]Shell script Saida do script[/caption]

Bom com esses exemplos creio que ficou melhor o entendimento da função let.

Outra função é o bc, veja como usar essa função:

No caso desta função se você for fazer os cálculos direto no shell ou em um script faça desta forma:

echo 89*9 |bc

Mais como assim?

Bom como já deu pra ver o comando echo imprima na tela a saída do comando bc que foi redirecionado com o (|),

Length (expressão) O valor da função de comprimento é o número de dígitos significativos na expressão.

Read() Leia um número da entrada padrão, independentemente de onde a função ocorre. Cuidado, isso pode causar problemas com a mistura de dados e programas na entrada padrão. O melhor uso para esta função está em um programa previamente escrito que precisa de entrada do usuário, mas nunca permite que o código do programa seja inserido pelo usuário.

scale (expressão) O número de dígitos após o ponto decimal na expressão.

sqrt (expressão) A raiz quadrada da expressão.

A maioria das expressões matemáticas padrão é, naturalmente, suportada: + - / *% ^

++ var incremente a variável por um e defina o novo valor como resultado da expressão.

var ++ O resultado da expressão é o valor da variável e a variável é então incrementada por uma.

- var diminua a variável por um e defina o novo valor como resultado da expressão. 

var - O resultado da expressão é o valor da variável e a variável é então diminuída por uma. 

(expr) Os parênteses alteram a precedência padrão para forçar a avaliação de uma expressão.

var = expr A variável var é atribuída ao valor da expressão.

Vou mostrar alguns exemplos da função bc em um scrip simples.

[caption id="attachment_984" align="aligncenter" width="451"]Shell script Exemplo de raiz quadrada e de escala com a função bc[/caption] [caption id="attachment_985" align="aligncenter" width="451"]Shell script Saida do exemplo da função bc[/caption]

 

Outra função é o test, veja como usar essa função:

Bom neste caso pra você testar essa função seria com a estrutura if e for, e é semelhante ao primeiro exemplo, com o if faça assim:

if [ exp1 -eq exp2 ]then

echo “A expressão é igual”

else

echo “A expressão não é igual”

fi

Uma omissão de EXPRESSÃO padrão é falsa. Caso contrário, EXPRESSÃO é verdadeira ou falsa e define o status de saída. É um dos seguintes:

! EXPRESSÃO A EXPRESSÃO é falsa
EXPRESSÃO1 -a EXPRESSÃO2 se a EXPRESSÃO01 e a EXPRESSÃO02 for verdadeiras
EXPRESSÃO1 -o EXPRESSÃO2 se a  EXPRESSÃO1 ou EXPRESSÃO2 for verdadeira
-n STRING o comprimento de STRING é diferente de zero
-z STRING o comprimento de STRING é zero
STRING1 = STRING2 as string são iguais
STRING1! = STRING2 as string não são iguais
INTEGER1 -eq INTEGER2 INTEGER1 é igual a INTEGER2
INTEGER1- in INTEGER2 INTEGER1 é maior ou igual a INTEGER2
INTEGER1 -gt INTEGER2 INTEGER1 é maior do que INTEGER2
INTEGER1 -le INTEGER2 INTEGER1 é menor ou igual a INTEGER2
INTEGER1 -lt INTEGER2 INTEGER1 é inferior a INTEGER2
INTEGER1 -ne INTEGER2 INTEGER1 não é igual a INTEGER2
AQUIVO1 -ef AQUIVO2 têm o mesmo dispositivo e números de inode
AQUIVO1 -nt AQUIVO2 AQUIVO1 é mais recente do que AQUIVO2
AQUIVO1 -ot AQUIVO2 AQUIVO1 é mais antigo do que o AQUIVO2
-b FICHA AQUIVO existe e é bloco especial
-c AQUIVO existe e é característico especial
-d FICHEIRO AQUIVO existe e é um diretório
-e FICHA O arquivo existe
-f FICHEIRO AQUIVO existe e é um arquivo regular
-g AQUIVO existe e é set-group-ID
-G AQUIVO existe e pertence ao ID do grupo efetivo
-h AQUIVO existe e é um link simbólico (o mesmo que -L )
-k FICHA AQUIVO existe e tem seu conjunto de bits pegajoso
-L FICHEIRO AQUIVO existe e é um link simbólico (o mesmo que -h )
-O FICHEIRO AQUIVO existe e pertence ao ID de usuário efetivo
-p ARQUIVO AQUIVOexiste e é um pipe nomeado
-r ARQUIVO AQUIVO existe e a permissão de leitura é concedida
-s AQUIVO existe e tem um tamanho maior que zero
-S AQUIVO existe e é um soquete
-t FD O descritor de arquivo FD é aberto em um terminal
-u FICHEIRO AQUIVO existe e seu bit set-user-ID está configurado
-w AQUIVO existe e a permissão de escrita é concedida
-x ARQUIVO existe e a permissão é concedida

 

Bom é isso a dica é pratique faça os testes com cada uma das funções que foi mostrada e bom estudo!

Anúncios