【原創】linux命令bc使用詳解


最近經常要在linux下做一些進制轉換,看到了可以使用bc命令,如下:

echo "obase=10;ibase=16;CFFF" | bc

用完以后就對bc進行了進一步的了解, man bc里面有詳細的使用說明。

 

1.是什么,怎么用

bc - An arbitrary precision calculator language   一個任意精度的計算器語言

從他的使用上來看,能夠對計算公式的語法進行解釋並返回出結果。有下面幾種使用方式:

1).交互式

輸入bc,進入交互式界面,然后輸入3+1,回車后在下一行打印出了4

 

2).echo+管道

echo "3+1" | bc 返回4到屏幕上

3).bc + 文件名

bc "calc.txt"   進入bc交互式界面並自動返回文本內算式的結果

當算術或者語法等出現錯誤時,程序會返回錯誤信息,如下:

1/0
Runtime error (func=(main), adr=3): Divide by zero

 

2.選項  

--help  -h 顯示選項頁

--interactive -i 使用交互模式

--mathlib  -l 執行指定語句前,先加載math函數庫

--warn  -w 對非POSIX的bc指令給出警告

--standard  -s 啟動POSIX模式下的bc程序

--quiet  -q 不顯示GNU bc 的歡迎
--version  -v 顯示版本信息

 

3.數字、變量、表達式和注釋

3.1數字

  操作基本都是圍繞數字,默認的輸出輸入進制都是十進制。數字有2個屬性 長度(length)和小數點后精度(scale), length值數字有效數字的長度,scale是值小數點后的長度。

如:0.001 length=3 scale=3

    45.78 length=4 scale=2

  關於數字,當使用十六進制時,英文ABCDEF必須大寫,大於16進制的則都用XX的十進制數字代表一位,如C=12

 

3.2 變量

  計算表達式的時候可以用變量,變量名為小寫字母開頭后面可以跟_,1,a。

變量分兩種:

普通變量: a=4;a   返回4

數組變量: a[1]=1;a[3]=3;a[1];a[2];a[3]  返回1 0 3

 

  另外有4個特殊的變量,他們有着特殊的意義,不能當做普通變量用,如下:

1)scale=10; 設置之后的scale為10,默認為0(及整數除法會返回整數)

2)obase=16;ibase=16; 設置輸入和輸出都為16進制,默認值為10

     注意:為10時可不設置ibase obase的值,obase要盡量放在ibase前,因為ibase設置后,后面的數字都是以ibase的進制來換算的

3)last,是指上一次返回出來的數字

 

3.3 表達式

  表達式跟C語言的都類似,主要就是

1)運算類 + - * / % ++ -- ^等

2)賦值類 = +=

3)關系類 > <=  其中true則返回1,false返回0

4)布爾類 && || 同上

注: a = 3 < 5 ,C語言中a=false,而bc中a=3,然后返回3<5的結果1      故一般帶賦值的算式后面盡量都要加括號來確保執行順序

  幾個特殊的表達式:

length(3.5)   取length 

scale(3.5)  取scale

sqrt(9)   取根號

read()  從標准輸入讀

 

3.4 注釋

注釋有兩種:

1)多行注釋 /* */

2)單行注釋#

 

4. 語句(statement) 和 函數

4.1語句

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,因為()是表達式

 

1)輸出可以用print, 如print a,b,c,d

2)可使用字符串 "abc\n"

3)其他的話跟C類似 if for while return break continue {}

 

4.2 函數

define [可選void] 函數名(參數列表[如:a, b, array[]]) {

  auto m,n,l;

     .... return 45;

}

auto 聲明的是局部變量,數組參數用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<---

 

 

還有一些數學庫,如s(1), c(1),l(1)等,需要bc -l 在啟動時導入數學庫,此時默認的scale=20

如輸出派 π :echo "4*a(1)" | bc -l    注a(1)表示arctan反正切函數

函數的一個例子:

 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,環境變量,版本對比等,這里不累述,有興趣直接里面看吧。

 

6.其他一些計算命令

1)dc  指令復雜些,更像是老式計算器

2)expr 如expr 3 + 4  主要是后面每個數字符號之間都得加空格

3)echo 如echo $((3+4)) echo $((16#CC)) 主要是多加()讓他產生計算的意義

4)awk 如'BEGIN{a=3+2;print a}'

 

小結:

  bc是一個較為完整,提供了完備的類似C的編程語法的計算器,可以在交互式界面、文本或管道的方式方便的進行一些邏輯運算。支持多進制轉換,任意精度調整,打印控制,函數支持,邏輯控制等。有疑惑的地方直接man bc即可有詳細的解釋。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM