📜  Linux 中的 bc 命令和示例

📅  最后修改于: 2022-05-13 01:57:33.774000             🧑  作者: Mango

Linux 中的 bc 命令和示例

bc命令用于命令行计算器。它类似于基本计算器,我们可以使用它进行基本的数学计算。
算术运算是任何一种编程语言中最基本的。 Linux 或 Unix 操作系统提供了bc 命令expr 命令进行算术计算。您也可以在 bash 或 shell 脚本中使用这些命令来计算算术表达式。

句法:

bc [ -hlwsqv ] [long-options] [ file ... ] 

选项:
-h , {- -help } : 打印用法并退出
-i , {- -interactive } : 强制交互模式
-l , {- -mathlib } : 定义标准数学库
-w , {- -warn } : 对 POSIX bc 的扩展给出警告
-s , {- -standard } :完全处理 POSIX bc 语言
-q , {- -quiet } : 不打印普通的 GNU bc Welcome
-v , {- -version } : 打印版本号和版权并退出

bc 命令支持以下功能:

  • 算术运算运算符
  • 递增或递减运算符
  • 赋值运算符
  • 比较或关系运算符
  • 逻辑或布尔运算符
  • 数学函数
  • 条件语句
  • 迭代语句

1. 算术运算符



例子:

Input : $ echo "12+5" | bc
Output : 17

Input : $ echo "10^2" | bc
Output : 100

如何将完整操作的结果存储在变量中?

例子:

Input:
$ x=`echo "12+5" | bc`
$ echo $x
Output:17

说明:将第一行输入的结果存储在变量 x 中,然后将变量 x 显示为$x

2.赋值运算符
支持的赋值运算符列表是:

  • var = value : 给变量赋值
  • var += value : 类似于 var = var + value
  • var -= value : 类似于 var = var – value
  • var *= value : 类似于 var = var * value
  • var /= value : 类似于 var = var / value
  • var ^= value : 类似于 var = var ^ value
  • var %= value : 类似于 var = var % value

例子:

Input: $ echo "var=10;var" | bc
Output: 10

说明:将 10 赋给变量并在终端上打印该值。

Input: $ echo "var=10;var^=2;var" | bc
Output: 100

说明:将变量的值平方并在终端上打印该值。



如何将完整操作的结果存储在变量中?

例子:

Input:
$ x=`echo "var=500;var%=7;var" | bc`
$ echo $x 
Output:3

说明: 将 500 模 7 的结果即 500/7 的余数存储在变量 x 中,然后将变量 x 显示为$x

3. 增量运算符
有两种增量运算符:

  • ++var : 预增运算符,先增加变量,然后存储变量的结果。
  • var++ : 后递增运算符,先使用变量的结果,然后递增变量。

例子:

Input: $ echo "var=10;++var" | bc
Output: 11

说明:先增加变量,然后存储变量的结果。

Input: $ echo "var=10;var++" | bc
Output: 10

说明:先使用变量的结果,然后增加变量。

4. 递减运算符
有两种递减运算符:

  • – – var : Pre decrement 运算符,变量先递减,然后存储变量的结果。
  • var – – : 后递减运算符,先使用变量的结果,然后递减变量。

例子:

Input: $ echo "var=10;--var" | bc
Output: 9

说明:先减少变量,然后存储变量的结果。



Input: $ echo "var=10;var--" | bc
Output: 10

说明:先使用变量的结果,然后变量递减。

5. 比较或关系运算符
关系运算符用于比较 2 个数字。如果比较为真,则结果为1 。否则(假),返回0 。这些运算符通常用于条件语句,如if

bc 命令支持的关系运算符列表如下所示:

  • expr1 :如果 expr1 严格小于 expr2,则结果为 1。
  • expr1<=expr2 :如果 expr1 小于或等于 expr2,则结果为 1。
  • expr1>expr2 :如果 expr1 严格大于 expr2,则结果为 1。
  • expr1>=expr2 :如果 expr1 大于或等于 expr2,则结果为 1。
  • expr1==expr2 :如果 expr1 等于 expr2,则结果为 1。
  • expr1!=expr2 :如果 expr1 不等于 expr2,则结果为 1。

例子:

Input: $ echo "10>5" | bc
Output: 1

Input: $ echo "1==2" | bc
Output: 0

6. 逻辑或布尔运算符
逻辑运算符主要用于条件语句。逻辑运算符的结果是1 (TRUE) 或0 (FALSE)。

  • expr1 && expr2 :如果两个表达式都非零,则结果为 1。
  • expr1 || expr2 :如果任一表达式非零,则结果为 1。
  • ! expr :如果 expr 为 0,则结果为 1。

例子:

Input: $ echo "10 && 5" | bc
Output: 1

Input: $ echo "0 || 0" | bc
Output: 0

Input: $ echo "! 0" | bc
Output: 1

7. 数学函数
支持的内置数学函数有:

  • s (x)x的正弦值,x 以弧度为单位。
  • c (x)x的余弦,x 以弧度为单位。
  • a (x)x的反正切,反正切返回弧度。
  • l (x)x的自然对数。
  • e (x) :将 e 提高到值 x 的指数函数。
  • j (n,x)x的整数阶 n 的贝塞尔函数。
  • sqrt(x) :数字 x 的平方根。如果表达式为负,则会生成运行时错误。

除了数学函数外,还支持以下函数:

  • length(x) :返回 x 中的位数。
  • read() :从标准输入中读取数字。
  • scale(expression) : scale函数的值是表达式中小数点后的位数。
  • ibaseobase定义输入和输出数字的转换基础。输入和输出的默认值为基数 10。
  • last (扩展名)是一个变量,它具有最后打印的数字的值。

例子:

Input:  
$ pi=`echo "h=10;4*a(1)" | bc -l`
$ echo $pi
Output: 3.14159265358979323844

说明:将“pi”的值赋给shell变量pi。这里, a 指的是反正切函数,它是用 -l 选项加载的数学库的一部分。



Input: $ echo "scale($pi)" | bc -l
Output: 20

说明:给出前面例子中计算出的“pi”值的小数点后的位数。

Input: $ echo "s($pi/3)" | bc -l
Output: .86602540378443864675

说明:在“pi/3”角给出正弦值。角度必须以弧度表示。这里,s指的是正弦函数

Input: $ echo "c($pi/3)" | bc -l
Output: .50000000000000000001

说明:给出“pi/3”角的余弦值。角度必须以弧度表示。这里,c 指的是余弦函数。

Input: $ echo "e(3)" | bc -l
Output:20.08553692318766774092 

说明:给出指数^值作为输出。

Input: $ echo "l(e(1))" | bc -l
Output: .99999999999999999999

解释:给出以 'e' 为底的值 iewrt 的自然对数。

Input: $ echo "obase=2;15" | bc -l
Output: 1111

解释:将十进制转换为二进制。

Input: $ echo "obase=8;9" | bc -l
Output: 11

解释:将十进制转换为八进制。

Input: $ echo "ibase=2;1111" | bc -l
Output: 15

解释:将二进制转换为十进制。

Input: $ echo "ibase=2;obase=8;10" | bc -l
Output: 2

解释:将二进制转换为八进制。

8. 条件语句

条件语句用于做出决定并根据这些决定执行语句。 bc 命令支持 if 条件。

句法:

if(condition) {statements} else {statements}

例子:

Input: $ echo 'n=8;m=10;if(n>m) print "n is greater" else print "m is greater" ' | bc -l
Output: m is greater

9. 迭代语句
bc 命令支持 for 循环和 while 循环进行迭代。

句法:

for(assignment; condition; updation)
{
      statements.....
      .......
      ........
}

OR

while(condition)
{
      statements.....
      .......
      ........
}

例子:

Input: $ echo "for(i=1; i<=10; i++) {i;}" | bc
Output: 
1
2
3
4
5
6
7
8
9
10
Input: $ echo "i=1;while(i<=10) {i; i+=1}" | bc
Output: 
1
2
3
4
5
6
7
8
9
10

说明:两个示例都使用各自的循环语法打印从 1 到 10 的数字。
一些伪语句

  • break :该语句导致强制退出最近的封闭 while 语句或 for 语句。
  • continue : continue 语句(扩展)导致最近的封闭 for 语句开始下一次迭代。
  • 暂停:暂停语句(扩展)是一条执行语句,它导致 bc 处理器仅在执行时退出。例如,“if (0 == 1)halt”不会因为没有执行halt而导致bc终止。
  • return :从函数返回值 0。 (参见功能部分)。
  • return(表达式) :从函数返回表达式的值。 (参见功能部分)。作为扩展,不需要括号。
  • 限制:打印本地版本的 bc 强制执行的本地限制。 (这是一个扩展)。
  • quit : 当quit 语句被读取时,bc 处理器被终止,不管在哪里找到quit 语句。例如,“if (0 == 1) quit”将导致 bc 终止。
  • 保修:打印保修通知。 (这是一个扩展)。

10. 函数:函数提供了一种定义可以稍后执行的计算的方法。 bc 中的函数总是计算一个值并将其返回给调用者。函数定义是“动态的”,因为函数在输入中遇到定义之前是未定义的。然后使用该定义,直到遇到另一个具有相同名称的定义函数。新定义然后替换旧定义。

句法:

define name (parameters) 
{
        statements.......
        .......
        ........
        return statement

} 

11. 我们可以将算术表达式写入文件,然后通过向 bc 命令提供文件名来执行这些语句。



例子:

Input : 
$ cat >> example.txt
2+5;
var = 10*3
var
print var
quit

Press ctrl+D

$ bc example.txt
Output : 
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
30

为避免在输出屏幕上出现系统生成的消息,请使用:

$ bc -q example.txt
Output :
7
30

12. 要点:

  1. Bc 命令将分号 (;) 或换行符视为语句分隔符。
  2. 要对语句进行分组,请使用花括号。与函数、if 语句、for 和 while 循环一起使用。
  3. 如果仅将表达式指定为语句,则 bc 命令会计算表达式并将结果打印在标准输出上。
  4. 如果找到赋值运算符。 Bc 命令将值分配给变量并且不在终端上打印该值。
  5. 函数应该在调用之前定义。函数定义始终应首先出现在调用语句之前。
  6. 如果发现独立变量作为语句,bc 命令将打印变量的值。您还可以使用打印语句在终端上显示值列表。