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.






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.


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!