BC a calculadora do Bash
Tags: linux, bash, ubuntu, braziliandevs
Published: 2021-03-17 10:57:39

Olá pessoal, hoje vamos aprender utilizar o **BC** , que é uma linguagem de programação, que podemos utilizar como calculadora no bash. Por ser uma linguagem de programação temos a opção de utilizar estrutura condicional, laços de repetições e outros recursos da linguagem.

O **BC** permite várias operações matemática e possui algumas operações definidas por padrão.

- `^` (potenciação);
- `*` (multiplicação) e `/` (divisão);
- `+` (adição), `-` (subtração), `%` (resto da divisão);
- `sqrt(x)` (raiz quadrada de x); e
- `last` (último resultado).

Abra o terminal e execute o comando a seguir, para ter acesso ao modo interativo:

```
bc
```

Digite as expressões a seguir, depois de digitar cada expressão pressione a tecla `Enter` para visualizar o resultado.

```
2^8
4*2
5/2
10%3
2+2
21-5
sqrt(last)
sqrt(81)
last-2
```

![Expressões matemáticas com o BC](https://franciscochaves.com.br/assets/img/blog/2020/dez/bc-expressoes.png)

Podemos observar que o resultado da divisão de 5 por 2 não foi exatamente o esperado, para isso temos que utilizar o `scale=2` para o resultado ter duas casas decimais após o ponto.

![Expressões matemáticas com o BC com o scale=2](https://franciscochaves.com.br/assets/img/blog/2020/dez/bc-expressoes-scale-2.png)

Para sair do modo interativo, utilize **_quit_**.

![Expressões matemáticas com o BC](https://franciscochaves.com.br/assets/img/blog/2020/dez/bc-expressoes-quit.png)

Outra forma para utilizar no modo interativo é ativar a biblioteca padrão de funções matemáticas, com a opção `-l` que tem por padrão o `scale=20` e assim podemos utilizar as seguintes funções:

- `s(x)` o seno de `x`, onde `x` é em radianos;
- `c(x)` o cosseno de `x`, onde `x` é em radianos;
- `a(x)` o arcotangente de `x`, a resposta é dada em radianos;
- `l(x)` o logaritmo natural de `x`;
- `e(x)` a função exponencial de `e` elevado a `x`; e
- `j(n, x)` a função de Bessel da ordem de `n` de `x`;

![Expressões matemáticas com o BC e opção -l](https://franciscochaves.com.br/assets/img/blog/2020/dez/bc-expressoes-com-opcao-l.png)

Agora vamos ver alguma opções de execução do **BC** diretamente na linha de comando.

Primeira forma de utilização:

```
bc <<< "scale=3;7/3"
```

Segunda forma de utilização:

```
echo "scale=3;7/3" | bc
```

Vamos utilizar o **BC** para conversão de base com os comandos `ibase` (base numérica de entrada) e `obase` (base numérica de saída), por padrão a base de entrada e saída é 10, e se utilizar apenas um dígito será interpretado em hexadecimal, veja alguns exemplos:

Converter o número hexadecimal 3F para decimal.

```
bc <<< "ibase=16;obase=A;3F"
```

Converter o número decimal 63 em hexadecimal.

```
bc <<< "ibase=A;obase=16;63"
```

Converter o número decimal 63 em octal.

```
bc <<< "ibase=A;obase=8;63"
```

Converter o número octal 77 em decimal.

```
bc <<< "ibase=8;obase=A;77"
```

Converter o número decimal 63 em binário.

```
bc <<< "ibase=A;obase=2;63"
```

Converter o número binário 111111 em decimal.

```
bc <<< "ibase=2;obase=A;111111"
```

Também podemos criar um _script_ para verificar se o número é ímpar ou par, crie o arquivo abaixo e salve o arquivo com o nome `par-ou-impar.bc`:

```
#!/usr/bin/bc -l

# autor: Francisco Chaves <https://franciscochaves.com.br>
# descrição: Descubra se o número é ímpar ou par

print "\n"

for (i=0; i < 40; i++) {
  print "*"
}

print "\nInsira um número inteiro\n"

num = read()

if (num % 2 == 0) {
  print "Número é par"
} else {
  print "Número é ímpar"
}

print "\n"

cont=0

while (cont++ < 40) {
  print "*"
}

print "\n"

quit
```

Atribua permissão de execução ao arquivo:

```
chmod +x par-ou-impar.bc
```

Execute o arquivo e insira um valor válido, o **BC** não tem tratamento de erros:

```
./par-ou-impar.bc
```

![Script em BC para saber se o número é ímpar ou par](https://franciscochaves.com.br/assets/img/blog/2020/dez/bc-expressoes-script-impar-ou-par.png)

Outra coisa bem interessante é a criação de funções com o **BC** , para isso utilizamos o comando `define`. Vamos criar o script com o nome `calculadora.bc` com funções de uma simples calculadora.

```
#!/usr/bin/bc -l

# autor: Francisco Chaves <https://franciscochaves.com.br>
# descrição: Operações matemáticas básicas

define soma(a, b) {
  return a + b
}

define subtracao(a, b) {
  return a - b
}

define multiplicacao(a, b) {
  return a * b
}

define divisao(a, b) {
  scale=2
  return a / b
}

print "\n ********CALCULADORA******** \n"

print "\nDigite o primeiro número:\n"
num1 = read()

print "\nDigite o segundo número:\n"
num2 = read()

print "\n **Soma** \n "
soma(num1, num2)
print "\n **Subtração** \n "
subtracao(num1, num2)
print "\n **Multiplicação** \n "
multiplicacao(num1, num2)
print "\n **Divisão** \n "
divisao(num1, num2)

quit
```

![Script em BC para operações matemáticas básicas](https://franciscochaves.com.br/assets/img/blog/2020/dez/bc-expressoes-script-calculadora.png)

Para conhecer mais sobre o **BC** consulte o manual com o comando abaixo:

```
man bc
```

## Referências

BC | GUIA LINUX. [s.d.]. **UNIRIO / CCET - Ensino e Pesquisa - Produzir e disseminar conhecimento**. Disponível em: https://guialinux.uniriotec.br/bc/. Acesso em: 24 dez. 2020.

CONVERSÃO DE BASE NO SHELL. 9 ago. 2017. **Mente Binária**. Disponível em: https://www.mentebinaria.com.br/forums/topic/54-conversão-de-base-no-shell/. Acesso em: 24 dez. 2020.

ENTENDEU “IBASE” E “OBASE” EM CASO DE CONVERSÕES COM BC?. **QA Stack**. Disponível em: https://qastack.com.br/unix/199615/understand-ibase-and-obase-in-case-of-conversions-with-bc. Acesso em: 24 dez. 2020.

PAPO BINÁRIO. Cálculo No Shell Com O Bc. 8 mar. 2017. **YouTube**. Disponível em: https://www.youtube.com/watch?v=vLhABLeb11o. Acesso em: 24 dez. 2020.

PINHEIRO, Renan. BC: A Sua Calculadora Programvel No Linux [Artigo]. 21 maio 2006. **VIVA O LINUX**. Disponível em: https://www.vivaolinux.com.br/artigo/BC-A-sua-calculadora-programavel-no-Linux. Acesso em: 24 dez. 2020.

SLACKJEFF. BC, CALCULADORA DO BASH. 12 set. 2017. **YouTube**. Disponível em: https://www.youtube.com/watch?v=5FGmQB-pM2Y. Acesso em: 24 dez. 2020.