Operadores Aritméticos no Bash
Os operadores no Bash seguem as mesmas regras de prioridade, associatividade e comportamento da linguagem C. A tabela abaixo lista os operadores em ordem decrescente de prioridade.
| Operador | Função |
|---|---|
| id++, id-- | Incremento e decremento pós-operação |
| ++id, --id | Incremento e decremento pré-operação |
| -, + | Unário negativo e positivo |
| !, ~ | Negação lógica e bitwise |
| ** | Exponenciação |
| *, /, % | Multiplicação, divisão, módulo |
| +, - | Adição, subtração |
| <<, >> | Deslocamento à esquerda e à direita |
| <=, >=, <, > | Comparações |
| ==, != | Igualdade, desigualdade |
| & | AND bitwise |
| ^ | XOR bitwise |
| | | OR bitwise |
| && | AND lógico |
| || | OR lógico |
| expr?expr:expr | Operador condicional |
| =, *=, /=, %=, +=, -=, <<=, >>=, &=, ^=, |= | Atribuição |
| expr1, expr2 | Operador vírgula (usado principalmente em loops for) |
O operador vírgula avalia múltiplas expressões aritméticas e retorna o valor da última. Exemplo:
$ let resultado=(5*3, 12-4, 18%7)
$ echo $resultado
4
$ let contador=0, valor=100
$ echo $valor
100
Constantes Numéricas
Por padrão, expressões aritméticas no Shell usam números decimais.
$ let decimal=15
$ echo "Decimal: $decimal"
Decimal: 15
$ let octal=017 # Octal com prefixo 0
$ echo "Octal: $octal"
Octal: 15
$ let hexadecimal=0xF # Hexadecimal com prefixo 0x
$ echo "Hexadecimal: $hexadecimal"
Hexadecimal: 15
$ let binario=2#1101 # Binário com prefixo base#
$ echo "Binário: $binario"
Binário: 13
$ let base16=16#1F # Base 16
$ echo "Base-16: $base16"
Base-16: 31
Expansão Aritmética e Comando let
A expansão aritmética calcula uma expressão e a substitui pelo resultado. Formato: $((EXPRESSSÃO)). As expressões podem ser aninhadas.
$ valor=8
$ valor=$(( valor * 2 + 3 ))
$ echo $valor
19
$ a=20
$ b=7
$ resto=$(( a % b ))
$ echo $resto
6
$ condicao=$(( 5 > 2 ))
$ echo $condicao # Verdadeiro retorna 1
1
$ x=50
$ y=30
$ max=$(( (x>y) ? x : y ))
$ echo $max
50
O comando let avalia expressões aritméticas de esquerda para direita, supotrando apenas intieros. Se a última expressão avaliada como verdadeira (1), retorna código de saída 0; caso contrário, 1.
$ let num=10
$ let num+=5
$ echo $num
15
$ let "num = num * 3"
$ echo $num
45
$ let "num >>= 2"
$ echo $num # Deslocamento à direita por 2 bits
11
$ let num++
$ echo $num
12
$ let "num = num < 20 ? num : 20"
$ echo $num
12
Comando expr
O comando expr é uma ferramenta de linha de comando para avaliar expressões. Requer espaços em torno dos operadores e exige escaping para alguns símbolos.
$ expr 4 + 7
11
$ expr 4+7 # Sem espaços, imprime a expressão
4+7
$ expr 5 \* 9 # Operador * precisa de escaping
45
$ expr 3 \< 8 # Operador < precisa de escaping
1
$ expr 10 \>= 4 # Operador >= precisa de escaping
1
$ var1=12
$ var2=5
$ produto=$(expr $var1 \* $var2) # Usando substituição de comando
$ echo $produto
60