Loading... Bash Shell 内置了对整数运算的支持,但是并不支持浮点运算,而 Linux bc 命令可以很方便的进行浮点运算,当然整数运算也不再话下。 bc 甚至可以称得上是一种编程语言了,它支持变量、数组、输入输出、分支结构、循环结构、函数等基本的编程元素 # 基础用法 ## bc命令选项 <table style="width: 300px" align="center"> <tbody> <tr><th>选项</th><th>说明</th></tr> <tr><td>-h | --help</td><td>帮助信息</td></tr> <tr><td>-v | --version</td><td>显示命令版本信息</td></tr> <tr><td>-l | --mathlib</td><td>使用标准数学库</td></tr> <tr><td>-i | --interactive</td><td>强制交互</td></tr> <tr><td>-w | --warn</td><td>显示 POSIX 的警告信息</td></tr> <tr><td>-s | --standard</td><td>使用 POSIX 标准来处理</td></tr> <tr><td>-q | --quiet</td><td>不显示欢迎信息</td></tr> </tbody> </table> ## 运算符 <table style="width: 200px" align="center"> <tbody> <tr><th>符号</th><th>功能</th></tr> <tr><td>基本运行符</td><td></td></tr> <tr><td>+</td><td>加法</td></tr> <tr><td>-</td><td>减法</td></tr> <tr><td>*</td><td>乘法</td></tr> <tr><td>/</td><td>除法</td></tr> <tr><td>^</td><td>指数</td></tr> <tr><td>%</td><td>取余</td></tr> <tr><td>赋值运算符</td><td></td></tr> <tr><td>++</td><td>自增1</td></tr> <tr><td>--</td><td>自减1</td></tr> <tr><td>=</td><td>赋值</td></tr> <tr><td>+=</td><td>加且赋值</td></tr> <tr><td>-=</td><td>减且赋值</td></tr> <tr><td>*=</td><td>乘且赋值</td></tr> <tr><td>/=</td><td>除且赋值</td></tr> <tr><td>关系运算符</td><td></td></tr> <tr><td>></td><td>大于</td></tr> <tr><td>>=</td><td>大于等于</td></tr> <tr><td><</td><td>小于</td></tr> <tr><td><=</td><td>小于等于</td></tr> <tr><td>==</td><td>等于</td></tr> <tr><td>!=</td><td>不等于</td></tr> <tr><td>逻辑运算符</td><td></td></tr> <tr><td>&&</td><td>逻辑与</td></tr> <tr><td>||</td><td>逻辑或</td></tr> <tr><td>!</td><td>逻辑非</td></tr> </tbody> </table> <span style="color:#b22222;">注意:关系运算符和逻辑运算符产生的结果是布尔值。</span> ## 内置变量 <table style="width: 650px" align="center"> <tbody> <tr><th>变量名</th><th>作 用</th></tr> <tr><td>scale</td><td>指定精度,也即小数点后的位数;默认为 0,也即不使用小数部分。</td></tr> <tr><td>ibase</td><td>指定输入的数字的进制,默认为十进制。</td></tr> <tr><td>obase</td><td>指定输出的数字的进制,默认为十进制。</td></tr> <tr><td>last 或者 .</td><td>表示最近打印的数字</td></tr> </tbody> </table> <span style="color:#b22222;">注意:obase 要尽量放在 ibase 前面,因为 ibase 设置后,后面的数字都是以 ibase 的进制来换算的。</span> ## 内置函数 <table style="width: 400px" align="center"> <tbody> <tr><th>函数名</th><th>作用</th></tr> <tr><td>s(x)</td><td>计算 x 的正弦值,x 是弧度值。</td></tr> <tr><td>c(x)</td><td>计算 x 的余弦值,x 是弧度值。</td></tr> <tr><td>a(x)</td><td>计算 x 的反正切值,返回弧度值。</td></tr> <tr><td>l(x)</td><td>计算 x 的自然对数。</td></tr> <tr><td>e(x)</td><td>求 e 的 x 次方。</td></tr> <tr><td>j(n, x)</td><td>贝塞尔函数,计算从 n 到 x 的阶数。</td></tr> </tbody> </table> 要想使用这些数学函数,在输入 bc 命令时需要使用`-l`选项,表示启用数学库。 ## 在交互式环境下使用 bc 使用 bc 进行数学计算是非常容易的,像平常一样输入数学表达式,然后按下回车键就可以看到结果,请看下图。 <div style="text-align: center;"> <img alt="使用bc进行数学计算" src="http://c.biancheng.net/uploads/allimg/190308/1-1Z30Q30253434.gif"></div> ## 在 Shell 中使用 bc 计算器 在 Shell 脚本中,我们可以借助管道或者输入重定向来使用 bc 计算器。* 管道是 Linux 进程间的一种通信机制,它可以将前一个命令(进程)的输出作为下一个命令(进程)的输入,两个命令之间使用竖线`|`分隔。 * 通常情况下,一个命令从终端获得用户输入的内容,如果让它从其他地方(比如文件)获得输入,那么就需要重定向。 此处我们并不打算展开讲解管道和重定向,不了解的小伙伴请自行百度。#### 借助管道使用 bc 计算器 如果读者希望直接输出 bc 的计算结果,那么可以使用下面的形式:echo "expression" | bc `expression`就是希望计算的数学表达式,它必须符合 bc 的语法,上面我们已经进行了介绍。在 expression 中,还可以使用 Shell 脚本中的变量。 使用下面的形式可以将 bc 的计算结果赋值给 Shell 变量:variable=$(echo "expression" | bc) variable 就是变量名。 【实例1】最简单的形式: ```bash $ echo "3*8"|bc $ 24 $ ret=$(echo "4+9"|bc) $ echo $ret $ 13 ``` 【实例2】使用 bc 中的变量: ``` $ echo "scale=4;3*8/7"|bc $ 3.4285 $ echo "scale=4;3*8/7;last*5"|bc $ 3.4285 $17.1425 ``` 【实例3】使用 Shell 脚本中的变量: ``` $ x=4 $ echo "scale=5;n=$x+2;e(n)"|bc -l $ 403.42879 ``` 在第二条命令中,`$x`表示使用第一条 Shell 命令中定义的变量,`n`是在 bc 中定义的新变量,它和 Shell 脚本是没关系的。 【实例4】进制转换: ``` #十进制转十六进制 [mozhiyan@localhost ~]$ m=31 [mozhiyan@localhost ~]$ n=$(echo "obase=16;$m"|bc) [mozhiyan@localhost ~]$ echo $n 1F #十六进制转十进制 [mozhiyan@localhost ~]$ m=1E [mozhiyan@localhost ~]$ n=$(echo "obase=10;ibase=16;$m"|bc) [mozhiyan@localhost ~]$ echo $n 30 ``` #### 借助输入重定向使用 bc 计算器 可以使用下面的形式将 bc 的计算结果赋值给 Shell 变量:variable=$(bc << EOF expressions EOF ) 其中,`variable`是 Shell 变量名,`express`是要计算的数学表达式(可以换行,和进入 bc 以后的书写形式一样),`EOF`是数学表达式的开始和结束标识(你也可以换成其它的名字,比如 aaa、bbb 等)。 请看下面的例子: ``` $ m=1E $ n=$(bc << EOF > obase=10; > ibase=16; > print $m > EOF > ) $ echo $n 30 ``` 如果你有大量的数学计算,那么使用输入重定向就比较方便,因为数学表达式可以换行,写起来更加清晰明了。 # 进阶用法 除了变量,bc 还支持函数、循环结构、分支结构等常见的编程元素,它们和其它编程语言的语法类似。 ## 注释 注释有两种: - 多行注释 /* */ - 单行注释 # ## 特殊表达式 下面的内容是几个内置的特殊表达式,也有些资料将它们定义为特殊运算符。 我个人认为这些可能是内置的一些拥有某些功能的函数,下面的表达式在调用。 length(3.5) 取length scale(3.5) 取scale sqrt(9) 取根号 read() 从标准输入读 ## 语句和输出 **语句:** 1+1 2+2 等价于1+1;2+2,都会返回两行 2 4 。 但是给变量赋值是不会输出值得,故1+1;2+2;a=3;b=4 还是返回两行2 4。 故:分隔符是 分号或者回车,纯赋值不会产生输出,表达式会以obase进制输出到标准输出 a=1 无输出 (a=1)会输出1,因为()是表达式 <div style="text-align: center;"> <img alt="在bc中定义函数" src="http://list.wangjm.ml/usr/uploads/2021/07/2534601604.png"></div> **输出:** 输出可以用print, 如print a,b,c,d 可使用字符串 "abc\n" 可以使用print实现格式化输了,如下图所示。 <div style="text-align: center;"> <img alt="在bc中定义函数" src="http://list.wangjm.ml/usr/uploads/2021/07/3106363695.png"></div> ## 自定义函数 **模板:** ``` define [可选void] 函数名(参数列表[如:a, b, array[]]) { auto m,n,l; .... return 45; } ``` auto 声明的是局部变量,数组参数用array[]表示,返回值写了void的就不会打印最终返回值, 下图的操作定义一个了求阶乘的函数: <div style="text-align: center;"> <img alt="在bc中定义函数" src="http://c.biancheng.net/uploads/allimg/190308/1-1Z30Q3323G03.gif"></div> ## 流程控制 下列语句的使用方式跟C语言类似 - if - for - while - return - break - continue - {} # 其它一些计算指令 - dc 指令复杂些,更像是老式计算器 - expr 如expr 3 + 4 主要是后面每个数字符号之间都得加空格 - echo 如echo $((3+4)) echo $((16#CC)) 主要是多加()让他产生计算的意义 - awk 如'BEGIN{a=3+2;print a}' # 参考资料: [Linux bc命令详解:一款数学计算器](http://c.biancheng.net/view/2680.html) [Oracle Solaris手册](https://docs.oracle.com/cd/E56344_01/html/E54075/bc-1.html) [bc命令详解](https://www.cnblogs.com/machangwei-8/p/10388510.html) ``` ``` 最后修改:2021 年 07 月 03 日 03 : 11 AM © 允许规范转载 赞赏 如果觉得我的文章对你有用,请随意赞赏 赞赏作者