【原创】linux命令bc使用详解
最近經(jīng)常要在linux下做一些進(jìn)制轉(zhuǎn)換,看到了可以使用bc命令,如下:
echo "obase=10;ibase=16;CFFF" | bc
用完以后就對bc進(jìn)行了進(jìn)一步的了解,?man bc里面有詳細(xì)的使用說明。
?
1.是什么,怎么用
bc - An arbitrary precision calculator language ? 一個任意精度的計算器語言。
從他的使用上來看,能夠?qū)τ嬎愎降恼Z法進(jìn)行解釋并返回出結(jié)果。有下面幾種使用方式:
1).交互式
輸入bc,進(jìn)入交互式界面,然后輸入3+1,回車后在下一行打印出了4
?
2).echo+管道
echo "3+1" | bc 返回4到屏幕上
3).bc + 文件名
bc "calc.txt" ? 進(jìn)入bc交互式界面并自動返回文本內(nèi)算式的結(jié)果
當(dāng)算術(shù)或者語法等出現(xiàn)錯誤時,程序會返回錯誤信息,如下:
1/0
Runtime error (func=(main), adr=3): Divide by zero
?
2.選項
--help ?-h 顯示選項頁
--interactive?-i 使用交互模式
--mathlib ?-l 執(zhí)行指定語句前,先加載math函數(shù)庫
--warn ?-w 對非POSIX的bc指令給出警告
--standard ?-s 啟動POSIX模式下的bc程序
--quiet ?-q 不顯示GNU bc 的歡迎
--version ?-v 顯示版本信息
?
3.數(shù)字、變量、表達(dá)式和注釋
3.1數(shù)字
操作基本都是圍繞數(shù)字,默認(rèn)的輸出輸入進(jìn)制都是十進(jìn)制。數(shù)字有2個屬性 長度(length)和小數(shù)點后精度(scale), length值數(shù)字有效數(shù)字的長度,scale是值小數(shù)點后的長度。
如:0.001 length=3 scale=3
? ? 45.78 length=4 scale=2
關(guān)于數(shù)字,當(dāng)使用十六進(jìn)制時,英文ABCDEF必須大寫,大于16進(jìn)制的則都用XX的十進(jìn)制數(shù)字代表一位,如C=12
?
3.2 變量
計算表達(dá)式的時候可以用變量,變量名為小寫字母開頭后面可以跟_,1,a。
變量分兩種:
普通變量: a=4;a ? 返回4
數(shù)組變量: a[1]=1;a[3]=3;a[1];a[2];a[3] ?返回1 0 3
?
另外有4個特殊的變量,他們有著特殊的意義,不能當(dāng)做普通變量用,如下:
1)scale=10; 設(shè)置之后的scale為10,默認(rèn)為0(及整數(shù)除法會返回整數(shù))
2)obase=16;ibase=16; 設(shè)置輸入和輸出都為16進(jìn)制,默認(rèn)值為10
? ? ?注意:為10時可不設(shè)置ibase obase的值,obase要盡量放在ibase前,因為ibase設(shè)置后,后面的數(shù)字都是以ibase的進(jìn)制來換算的
3)last,是指上一次返回出來的數(shù)字
?
3.3 表達(dá)式
表達(dá)式跟C語言的都類似,主要就是
1)運(yùn)算類 + - * / % ++ -- ^等
2)賦值類 = +=
3)關(guān)系類 > <= ?其中true則返回1,false返回0
4)布爾類 && || 同上
注: a = 3 < 5 ,C語言中a=false,而bc中a=3,然后返回3<5的結(jié)果1??? ? 故一般帶賦值的算式后面盡量都要加括號來確保執(zhí)行順序
幾個特殊的表達(dá)式:
length(3.5) ? 取length?
scale(3.5) ?取scale
sqrt(9) ? 取根號
read() ?從標(biāo)準(zhǔn)輸入讀
?
3.4 注釋
注釋有兩種:
1)多行注釋 /* */
2)單行注釋#
?
4. 語句(statement) 和 函數(shù)
4.1語句
1+1
2+2
等價于1+1;2+2,都會返回兩行 2 ?4 。
但是給變量賦值是不會輸出值得,故1+1;2+2;a=3;b=4 還是返回兩行2 4。
故:分隔符是 分號或者回車,純賦值不會產(chǎn)生輸出,表達(dá)式會以obase進(jìn)制輸出到標(biāo)準(zhǔn)輸出
? ?a=1 無輸出 ? ?(a=1)會輸出1,因為()是表達(dá)式
?
1)輸出可以用print, 如print a,b,c,d
2)可使用字符串 "abc\n"
3)其他的話跟C類似 if for while return break continue {}
?
4.2 函數(shù)
define [可選void] 函數(shù)名(參數(shù)列表[如:a, b, array[]]) {
auto m,n,l;
? ? ?.... return 45;
}
auto 聲明的是局部變量,數(shù)組參數(shù)用array[]表示,返回值寫了void的就不會打印最終返回值,如下
1 define py (y) { print "--->", y, "<---", "0; }
2 define void px (x) { print "--->", x, "<---", "0; }
3 py(1)
4 --->1<---
5 0
6 px(1)
7 --->1<--- ?
?
還有一些數(shù)學(xué)庫,如s(1), c(1),l(1)等,需要bc -l 在啟動時導(dǎo)入數(shù)學(xué)庫,此時默認(rèn)的scale=20
如輸出派 π :echo "4*a(1)" | bc -l ? ?注a(1)表示arctan反正切函數(shù)
函數(shù)的一個例子:
1 /* Uses the fact that e^x = (e^(x/2))^2
2 When x is small enough, we use the series:
3 e^x = 1 + x + x^2/2! + x^3/3! + ...
4 */
5
6 define e(x) {
7 auto a, d, e, f, i, m, v, z
8
9 /* Check the sign of x. */
10 if (x<0) {
11 m = 1
12 x = -x
13 }
14
15 /* Precondition x. */
16 z = scale;
17 scale = 4 + z + .44*x;
18 while (x > 1) {
19 f += 1;
20 x /= 2;
21 }
22
23 /* Initialize the variables. */
24 v = 1+x
25 a = x
26 d = 1
27
28 for (i=2; 1; i++) {
29 e = (a *= x) / (d *= i)
30 if (e == 0) {
31 if (f>0) while (f--) v = v*v;
32 scale = z
33 if (m) return (1/v);
34 return (v/1);
35 }
36 v += e
37 }
38 } ?
?
5.其他
man bc最后還介紹了一下全局limits,環(huán)境變量,版本對比等,這里不累述,有興趣直接里面看吧。
?
6.其他一些計算命令
1)dc ?指令復(fù)雜些,更像是老式計算器
2)expr 如expr 3 + 4 ?主要是后面每個數(shù)字符號之間都得加空格
3)echo 如echo $((3+4)) echo $((16#CC)) 主要是多加()讓他產(chǎn)生計算的意義
4)awk 如'BEGIN{a=3+2;print a}'
?
小結(jié):
bc是一個較為完整,提供了完備的類似C的編程語法的計算器,可以在交互式界面、文本或管道的方式方便的進(jìn)行一些邏輯運(yùn)算。支持多進(jìn)制轉(zhuǎn)換,任意精度調(diào)整,打印控制,函數(shù)支持,邏輯控制等。有疑惑的地方直接man bc即可有詳細(xì)的解釋。
轉(zhuǎn)載于:https://www.cnblogs.com/vanishfan/p/4359296.html
總結(jié)
以上是生活随笔為你收集整理的【原创】linux命令bc使用详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Solr初始化源码分析-Solr初始化与
- 下一篇: 最酷的微信网名