bc une calculatrice scientifique complète...
bc est une calculatrice basique sous unix. Mais elle n'a de basique que le nom car elle permet d'avoir des possibilités et des fonctionnalités bien plus avancées que la plupart des calculatrices. bc est aux opérations mathématiques ce que awk est à la manipulation de texte.
Petit tour d'horizon
bc possède deux modes d'utilisation, un premier en mode interactif, qui permet de 'lutiliser directement en ligne de commande pour des opérations ponctuelles, un second mode, un mode flot, qui permet d'effectuer des opérations en série (à partir d'un fichier ou d'un script).mode interactif
Le mode interactif est simplement appelé par la commande bc. Le programme attend ensuite les intructions, tout comme le ferait ftp ou telnet, et s'arrête avec la commande quit. Lançons donc bc :# bc bc 1.06 Copyright 1991-1994, 1997, 1998, 2000 Free Software Foundation, Inc. This is free software with ABSOLUTELY NO WARRANTY. For details type `warranty'.
3+5 8 ./2 4 ./3 1
Remarque
Le point "." permet de rappeler la valeur courante. Dans notre exemple, le point rappelle 8 puis 4.scale=50 4/3 1.3333333333333333333333333333333333333333333333333
obase=16 85+3 58
ibase=2 111011101+110101010 387
Et ainsi de suite...
mode flot
Pour effectuer la même chose en mode flot, il suffit de rediriger les opérations d'une entrée vers bc :# echo 'scale=50; ibase=10;obase=16; 85+49' | bc 86
./2
./3
scale=50
4/3
obase=16
85+3
ibase=2
111011101+110101010
...
# cat monfichier.bc | bc 8 4 1 1.33333333333333333333333333333333333333333333333333 58 387
# bc < monfichier.bc 8 4 1 1.33333333333333333333333333333333333333333333333333 58 387
Il peut arriver d'avoir à effectuer des opérations sur le contenu d'un fichier. Par exemple, de faire la somme d'une colonne. S'il est possible et aisé de le faire avec awk, bc permet tout aussi bien de le faire. Mais awk peut s'avérer vite moins efficace si les opérations deviennent complexes.
Avec bc, par exemple, une somme de colonne se fera de la façon suivante :
# ls -l | awk 'NR>1 {print ".+" $5}' | bc | tail -1
Fonctions avancées
Si bc ne savait faire que cela, il n'aurait pas beaucoup d'intérêt. Cependant, tout comme awk, bc sait interpréter un langage qui permet de réaliser des fonctions bien plus avancées.Fonctions avancées en mathématiques
L'option l permet à bc de disposer des opérations mathématiques suivantes :- s(x) : sin x
- c(x) : cos x
- e(x) : exp x
- l(x) : ln x
- a(x) : atn x
- j(n,x) : bessel
# echo 'scale=50; l(25)' | bc -l 3.21887582486820074920151866645237527905120270853703
Définir ses propres fonctions
Grâce à un langage associé, bc permet également de définir d'autres fonctions inexistantes. Par exemple :define log(n,x) {
scale=50
y = l(x) / l(n)
return (y)
}
Cette fonction est créée dans un fichier. Par exemple, fnc.bc. Pour utiliser cette fonction, il suffit alors de l'employer comme suit :
# echo 'log(10,25)' | bc -l fnc.bc 1.39794000867203760957252221055101394646362023707578
De la même façon, ce langage gère les boucles (if(cond)..., while(cond)... et for(init;cond;inc)...) , les condition (if(cond)..., else ...), etc. Pour plus de détails, reportez-vous au manuel de la commande.
Un problème peut subsister dans cet usage. La notation impose d'utiliser bc -l fnc.bc pour choisir quelle bibliothèque de fonctions personnelles employer. Cela sera plus simple si l'on n'avait pas à utiliser autant de paramètres. Pour cela, modifions notre fichier de définitions et ajouter sur la première ligne :
Nous pouvons ainsi utiliser directement la bibliothèque en exécutant ce fichier, soit de manière directe :
# fnc.bc log(10,25) 1.39794000867203760957252221055101394646362023707578
# echo 'log(10,25)' | fnc.bc 1.39794000867203760957252221055101394646362023707578