bc

bc是一种语言,通过交互式执行语句来支持任意精度数,bc首先按照列出的顺序处理命令行中列出的所有文件中的代码。
处理完所有文件后,bc从标准输入读取。
所有代码在读取时执行。(如果文件包含停止处理器的命令,则bc将永远不会从标准输入读取。)
bc最常见的用法是在shell脚本中

语法

  bc options file... 

选项:

-h, --help
   打印用法并退出.
-i, --interactive
   交互模式进行管道传输.

-l, --mathlib
   定义标准数学库.

-w, --warn
   G为POSIX bc的扩展发出警告.

-s, --standard
   完全处理POSIX bc语言.

-q, --quiet
   不要打印正常的GNU bc环境信息.

-v, --version
   打印版本号和版权并退出.

示例shell脚本

#!/bin/bash
# 使用bc进行计算的示例
if [ $# != 1 ]
   then
   echo "您没有输入数字参数"
   exit
fi

bc <<END-OF-INPUT
  scale=6
  /* 首先我们定义函数 */
  define myfunc(x){
     return(sqrt(x) + 10);
  }

 /* 然后使用函数进行计算*/
  x=$1
 "Processing";x;" result is ";myfunc(x)
 quit
END-OF-INPUT

echo "(to 6 decimal places)"

运行上面的脚本:

 $ chmod a+x bcsample
 $ ./bcsample 125

bc支持的标准功能

length ( expression )
length函数的值是表达式中的有效位数。

read ( )
从标准输入读取一个数字,无论函数发生在何处

scale ( expression )
小数点后的位数.

sqrt ( expression )
平方根.

++ var
将变量加1,并将新值设置为表达式的结果.

var ++
表达式的结果是变量的值,然后变量加1.

– var
将变量递减1并将新值设置为表达式的结果.

var –
表达式的结果是变量的值,然后变量减1.

( expr )
括号更改标准优先级.

var = expr
变量var分配表达式的值.

关系表达式和布尔运算也是合法的

基本使用

$ bc <<< 3*4
12
$ bc <<< 4+4
8
$ bc <<< 6-1
5
或者
$ echo "3*4" | bc
12
$ echo "4+4" | bc
8
$ echo "6-1" | bc
5

把算式写到文件中面,然后一次计算

$ cat bcFile 
8+5
7+7
#运行 bcFile 
$ bc < bcFile 
13
14

也能够使用HERE 命令:

$ bc << HERE
> 1+4
> 4-1
> 2*4
> HERE
5
3
8

能够使用内置的变量 last 引用上一次的结果:

$ echo "5-4;last+6" | bc
1
7

last 也能够用 点号取代:

$ echo "5-4;.+6" | bc
1
7

浮点数运算:
能够使用scale指定小数点之后的位数(默觉得0,即整数)

 $ echo "sqrt(10)" | bc
 3
 $ echo "scale=1;sqrt(10)" | bc
 3.1
 $ echo "scale=10;sqrt(10)" | bc
 3.1622776601

有时候得不到指定的位数:

$ echo "scale=10; 1.25*9" | bc
11.25
此时,能够改动为:
$ echo "scale=10; 1.25*9/1" | bc
11.2500000000

数制转换:

能够使用变量 ibase表示转换前数字的数制;obase表示转换后数字的数制

$ echo 'obase=16;128' | bc
80

$ echo 'ibase=16;obase=A;80' | bc
128
$ echo 'obase=2;128' | bc
10000000
$ echo 'ibase=2;obase=A;10000000' | bc
 128
$ echo "obase=10;ibase=16;80" | bc
128

指数运算:

$ echo "5^5" | bc
3125
$ echo "(5^5)^5" | bc
298023223876953125

记得第一个指数运算的结果要加入括号。
基于函数库的运算

bc支持下面函数:

s(x): 正弦函数(x为弧度)

c(x): 余弦函数(x为弧度)

a(x): 反正切函数(结果为弧度)

l(x): 自然对数函数

e(x): 以e为底的指数函数

j(n,x): 贝赛尔函数

此时。bc要加上 -l 參数 (此时。 scale 为20)

计算 log1.5(2) (以 1.5为底,2的对数):

$ echo "l(2)/l(1.5)" | bc -l
1.70951129135145477699

也能够用 awk命令:
$ awk 'BEGIN {printf “%1l.9f\n”, log(2)/log(1.5)}'
1.709511291

bc 命令实例:

linux命令:bc bc bcrootopen.com
linux命令:bc bc bcrootopen.com
2018-03-12 23:46:48

linux命令:bc -l <<< s(3/5) s(3/5) <<< -l bc bc -l <<< s(3/5)rootopen.com
linux命令:bc -l <<< s(3/5) s(3/5) <<< -l bc bc -l <<< s(3/5)rootopen.com
2018-05-16 13:00:48

linux命令:bc -l <<< "x=2; p=0.5; e(l(x)*p)" e(l(x)*p)" p=0.5; "x=2; <<< -l bc bc -l <<< "x=2; p=0.5; e(l(x)*p)"rootopen.com
linux命令:bc -l <<< "x=2; p=0.5; e(l(x)*p)" e(l(x)*p)" p=0.5; "x=2; <<< -l bc bc -l <<< "x=2; p=0.5; e(l(x)*p)"rootopen.com
2018-02-07 15:15:48

linux命令:bchunk IMAGE.bin IMAGE.cue IMAGE.iso IMAGE.iso IMAGE.cue IMAGE.bin bchunk bchunk IMAGE.bin IMAGE.cue IMAGE.isorootopen.com
linux命令:bchunk IMAGE.bin IMAGE.cue IMAGE.iso IMAGE.iso IMAGE.cue IMAGE.bin bchunk bchunk IMAGE.bin IMAGE.cue IMAGE.isorootopen.com
2017-12-25 12:59:48

linux命令:bc <<< `uptime | sed -e 's/^.*up //' -e 's/[^0-9:].*//' | sed 's/:/*60+/g'` 's/:/*60+/g'` sed | 's/[^0-9:].*//' -e //' 's/^.*up -e sed | `uptime <<< bc bc <<< `uptime | sed -e 's/^.*up //' -e 's/[^0-9:].*//' | sed 's/:/*60+/g'`rootopen.com
linux命令:bc <<< `uptime | sed -e 's/^.*up //' -e 's/[^0-9:].*//' | sed 's/:/*60+/g'` 's/:/*60+/g'` sed | 's/[^0-9:].*//' -e //' 's/^.*up -e sed | `uptime <<< bc bc <<< `uptime | sed -e 's/^.*up //' -e 's/[^0-9:].*//' | sed 's/:/*60+/g'`rootopen.com
2018-02-26 03:45:48

linux命令:bc <<< 'obase=60;299' 'obase=60;299' <<< bc bc <<< 'obase=60;299'rootopen.com
linux命令:bc <<< 'obase=60;299' 'obase=60;299' <<< bc bc <<< 'obase=60;299'rootopen.com
2018-02-03 17:46:48

linux命令:bc <<<"..." <<<"..." bc bc <<<"..."rootopen.com
linux命令:bc <<<"..." <<<"..." bc bc <<<"..."rootopen.com
2018-01-15 05:25:48

Linux的Bash命令行(A-Z排序)