bc 简单介绍

一. 用途说明

Bash 内置了对整数四则运算的支持,但是并不支持浮点运算,而 bc 命令可以很方便的进行浮点运算,当然整数运算也不在话下。

手册页上说 bc 是 An arbitrary precision calculator language,即一个任意精度的计算语言,注意是一种语言,它提供了一些语法结构,比如条件判断、循环等,可以说是很强大的,也可以用来进行进制转换。

二. 常用参数

1. bc基本的用法是
usage: bc [options] [file ...]
  -h  --help              print this usage and exit
  -i  --interactive       force interactive mode
  -l  --mathlib           use the predefine math routnes
  -q  --quiet             don't print initial banner
  -s  --standard          non-standard bc constructs are errors
  -w  --warn              warn about non-standard bc constructs
  -v  --version           print version information and exit

一般情况下,我们使用不带任何参数的 bc 命令。因为 bc 本身是一个命令解释器,要退出它只要直接输入 quit 回车或者按 Ctrl+D 终止。

2. 基本运算符
+        加法
-        減法
*        乘法
/        除法
^        指數
%        餘數
s(x)     正玄函数
c(x)     余玄函数
a(x)     反正切函数
l(x)     log函数 (以 2 为底)
e(x)     e的指数函数
j(n,x)   贝塞尔函数
3. 使用示例
a. 交互模式
^_^ ~ $ bc
bc 1.06.95
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'.
7*7
49
9-8
1
10^2
100
scale=2; 100/3
33.33
b. 通过管道计算
^_^ ~ $ echo "7*7" | bc
49
^_^ ~ $ echo "10^2" | bc
100
^_^ ~ $ echo "scale=3; 100/3" | bc       # 保留小数点精度只对除法、取余、乘幂有效
33.333
c. 进制转换

ibase 是输入数字的进制,而 obase 就是输出数字的进制了。iinputooutput

i. 10 进制转 2 进制:

^_^ ~ $ echo "obase=2;ibase=10;100" | bc
1100100

ii. 10 进制转 16 进制:

^_^ ~ $ echo "obase=16;ibase=10;100" | bc
64

iii. 16 进制转 2 进制:

^_^ ~ $ echo "ibase=16;obase=2;F1" | bc
11110001
d. 利用管道计算文件中的运算
^_^ ~ $ cat test
10^2
7*7
scale=3; 100/3
^_^ ~ $ cat test | bc
100
49
33.333
e. bash 中的运算

三角形面积计算,b 为底,h 为高,面积为 b*h/2

^_^ ~ $ cat area_of_triangle
#!/bin/bash

echo -n "Enter base of a triangle : "
read b

echo -n "Enter height of a triangle : "
read h

area=$(echo "scale=2;(1/2) * $b * $h"|bc)
echo "Area of a triangle is $area"

^_^ ~ $ ./area_of_triangle
Enter base of a triangle : 10
Enter height of a triangle : 5
Area of a triangle is 25.00
f. 数学库的使用

计算 8 位与 100 位圆周率的 π(pi)

^_^ ~ $ echo "scale=8; a(1)*4" | bc -l
3.14159264
^_^ ~ $ echo "scale=100; a(1)*4" | bc -l
3.141592653589793238462643383279502884197169399375105820974944592307\
8164062862089986280348253421170676

参考资料: