Sous Linux, bc est la calculatrice arbitrary-precision (précision arbitraire) du terminal. Contrairement à expr qui ne gère que des nombres entiers, bc supporte les nombres décimaux, les fonctions mathématiques avancées (trigonométrie, racines carrées, logarithmes), et peut même lire des calculs depuis un fichier ou un pipe.
Son nom vient de "Basic Calculator". C'est l'outil idéal pour des calculs rapides sans quitter le terminal.
bc est généralement préinstallé sur les distributions Linux. Si ce n'est pas le cas :
# Debian/Ubuntu
sudo apt install bc
# Fedora/RHEL
sudo dnf install bc
# Arch Linux
sudo pacman -S bc$ bc
bc 1.07.1
Copyright 1991-1994, 1997, 1998, 1999, 2000, 2004, 2017 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'.
5 + 3
8
10 * 2.5
25.0
quitDans le mode interactif, tapez vos calculs et appuyez sur Entrée. Tapez quit pour quitter.
$ echo "15 * 3.5" | bc
52.5
$ echo "scale=2; 100 / 3" | bc
33.33La variable scale définit le nombre de décimales affichées (par défaut : 0).
| Opérateur | Description | Exemple |
|---|---|---|
+ | Addition | 5 + 3 → 8 |
- | Soustraction | 10 - 4 → 6 |
* | Multiplication | 6 * 7 → 42 |
/ | Division | 22 / 7 → 3 (scale=0) |
% | Modulo (reste) | 17 % 5 → 2 |
^ | Puissance | 2 ^ 10 → 1024 |
sqrt(n) | Racine carrée | sqrt(16) → 4 |
Par défaut, bc affiche uniquement des nombres entiers. Pour obtenir des décimales, utilisez scale :
$ echo "scale=4; 10 / 3" | bc
3.3333
$ echo "scale=10; sqrt(2)" | bc
1.4142135623Sans scale, la division donne un résultat entier arrondi.
bc intègre une bibliothèque mathématique complète. Activez-la avec -l :
$ echo "scale=6; s(3.14159)" | bc -l
.000002Fonctions disponibles avec -l :
| Fonction | Description |
|---|---|
s(x) | Sinus (x en radians) |
c(x) | Cosinus (x en radians) |
a(x) | Arc tangente (retourne un angle en radians) |
l(x) | Logarithme naturel (ln) |
e(x) | Exponentielle (e^x) |
j(n, x) | Fonction de Bessel |
$ cat > calculs.txt << 'EOF'
scale=2
a = 150
b = 45
a + b
a * b / 100
sqrt(a)
EOF
$ bc -q calculs.txt
195.00
67.50
12.24L'option -q supprime le message de bienvenue.
$ echo "longueur=50; largeur=20; longueur * largeur" | bc
1000
$ resultat=$(echo "scale=2; (100 - 25) * 1.19" | bc)
$ echo $resultat
89.25$ echo "if (5 > 3) 100 else 0" | bc
100
$ echo "result = (75 >= 60) ? 1 : 0; result" | bc
1bc supporte les opérateurs de comparaison (>, <, >=, <=, ==, !=) et les instructions if/else, while, for.
$ echo "
factorial = 1
for (i = 1; i <= 10; i++) {
factorial = factorial * i
}
factorial
" | bc
3628800bc peut convertir entre différentes bases grâce à ibase et obase :
# Décimal vers binaire
$ echo "obase=2; 42" | bc
101010
# Binaire vers décimal
$ echo "ibase=2; 101010" | bc
42
# Hexadécimal vers décimal
$ echo "ibase=16; FF" | bc
255
# Décimal vers hexadécimal
$ echo "obase=16; 255" | bc
FF# 15% de 200
$ echo "200 * 15 / 100" | bc
30
# Vérifier si un nombre est dans un pourcentage
$ echo "if (45 >= 50) 1 else 0" | bc
0# Prix avec TVA 7.7%
$ echo "scale=2; prix_ht = 150; prix_ht * 1.077" | bc
161.55#!/bin/bash
# Calculer la moyenne de 3 notes
note1=85
note2=90
note3=78
moyenne=$(echo "scale=2; ($note1 + $note2 + $note3) / 3" | bc)
echo "Moyenne : $moyenne"
# Vérifier si l'élève réussit (moyenne >= 60)
resultat=$(echo "if ($moyenne >= 60) 1 else 0" | bc)
if [ "$resultat" -eq 1 ]; then
echo "Réussi !"
else
echo "Échec"
fi| Outil | Décimaux | Fonctions math | Usage typique |
|---|---|---|---|
expr | Non (entiers seulement) | Non | Calculs simples dans scripts |
bc | Oui (scale configurable) | Oui (trigo, log, sqrt...) | Calculs précis, scripts |
awk | Oui | Oui | Traitement de données tabulaires |
python | Oui | Oui (complet) | Calculs complexes, scripts |
| Option | Description |
|---|---|
-q | Mode silencieux (sans message de bienvenue) |
-l | Utiliser la bibliothèque mathématique (scale=20 par défaut) |
-c | Compiler seulement (sans exécuter) |
bc.echo "256 * 1024" | bc → 262144echo "scale=10; sqrt(2)" | bc → 1.4142135623echo "obase=2; 255" | bc → 11111111echo "obase=16; 255" | bc → FFecho "scale=2; celsius * 9 / 5 + 32" | bc où celsius est une variableecho "f=1; for(i=1;i<=20;i++) f*=i; f" | bc → 2432902008176640000