Linux 命令(101)—— bc 命令

  • 2019 年 11 月 26 日
  • 筆記

版權聲明:本文為博主原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。

本文鏈接:https://blog.csdn.net/K346K346/article/details/103202046

1.命令簡介

bc(Binary Calculator)命令用於任意精度的計算,語法類似於 C 語言。Bash 內置了對整數四則運算的支持,但是並不支持浮點運算,而 bc 命令可以很方便地進行浮點運算和整數運算。

本文描述的 GNU 版本超出了傳統 bc 的實現和 POSIX 標準。在使用擴展功能時,可以使用命令行選項打印警告或拒絕使用。

2.命令格式

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

3.選項說明

-h, --help  	顯示幫助信息並退出  -i, --interactive  	強制進入交互式模式  -l, --mathlib  	定義使用的標準數學庫  -w, --warn  	對 POSIX bc 的擴展給出警告信息  -s, --standard  	完全使用 POSIX 版本的 bc 功能  -q, --quiet  	不打印正常的 GNU bc 環境信息  -v, --version  	打印 bc 版本與版權後退出

4.特殊變量

bc 在運算過程中將數值存儲在兩種類型的變量中,簡單變量和數組。兩種變量均使用字母開頭後跟字母、數字或下劃線的命名方式且全部小寫。其中有四個特殊變量:

scale	定義某些操作如何使用小數點後的數字,默認值為 0  ibase	定義輸入數的基數,默認為十進制數  obase	定義輸出數的基數,默認為十進制數  last	表示最後的輸出值

5.注釋

bc 中的塊注釋使用/* */,行注釋使用 #。

6.表達式

表達式的輸入值可以是 2 到 16 進制的數值,數值的基數由特殊變量 ibase 決定。如果數值中包含字符 A-F,則必須使用大寫,因為小寫表示變量名。

在下面表達式的描述中,EXPR 指完整表達式,VAR 指簡單變量或數組變量。簡單變量只是一個名稱,數組變量被指定為 NAME[EXPR]。

除非特別提到,結果的精度是表達式中最大的精度。

基本運算:  - EXPR  	相反數  ++ VAR  	自增 1  -- VAR  	自減 1  VAR ++  	表達式的結果是變量的值,然後變量自增 1  VAR --  	表達式的結果是變量的值,然後變量自增 1  EXPR + EXPR  	兩個表達式相加  EXPR - EXPR  	兩個表達式相減  EXPR * EXPR  	兩個表達式相乘  EXPR / EXPR  	兩個表達式相除。結果的精度由特殊變量 scale 確定  EXPR % EXPR  	兩個表達式取余  EXPR ^ EXPR  	取冪。第二個表達式 EXPR 必須是整數  ( EXPR )  	這將更改標準優先級以強制執行表達式的計算  VAR = EXPR  	將表達式的結果賦給變量 VAR  VAR <OP>= EXPR  	這相當於 var = var EXPR    關係運算:  EXPR1 < EXPR2  EXPR1 <= EXPR2  EXPR1 > EXPR2  EXPR1 >= EXPR2  EXPR1 == EXPR2  EXPR1 != EXPR2    邏輯運算:  !EXPR  EXPR && EXPR  EXPR || EXPR

以上表達式涉及的運算符優先級由低到高依次為:

||			左結合  &&			左結合  !			非結合的  關係運算符	左結合  賦值運算符	由結合  +, -		左結合  *, /, %		左結合  ^			右結合  取反運算符	非結合的  ++, --		非結合的

以上運算符優先級與 C 語言有些出入,使用時需要注意。比如表達式 a = 3 < 5 在 C 語言中 a 的值為 0,在 bc 中,因為 = 的優先級高於 <,所以 a 的值為 3。

bc 中提供了一些特殊的表達式,這些與用戶定義的函數和標準函數有關,下文函數一節將會詳述。

7.語句

bc 的語句使用分號和換行符進行分隔,下面將介紹 bc 中常用的語句。注意,中括號 [] 中的內容是可選的。

EXPRESSION  	表達式分為賦值表達式與非賦值表達式,如果表達式不是賦值語句,則計算表達式並將其結果打印到輸出  STRING  	使用雙引號包圍的內容被視為字符串。字符串可以包含特殊字符,使用反斜杠表示,a 響鈴,b 退格,f 換頁,n 換行,r 回車,q 雙引號,t 製表符,\ 反斜杠  print LIST  	使用 print 語句進行輸出。LIST 是逗號分隔的字符串或者表達式  { STATEMENT_LIST }  	這是個複合語句,它允許將多個語句組合在一起執行  if ( EXPRESSION ) STATEMENT1 [else STATEMENT2]  	if 條件語句。如果表達式 EXPRESSION 結果非 0,則執行語句 STATEMENT1,否則執行 STATEMENT2  while ( EXPRESSION ) STATEMENT  	while 循環語句。如果表達式 EXPRESSION 結果非 0,則循環執行語句  for ( [EXPRESSION1] ; [EXPRESSION2] ; [EXPRESSION3] ) STATEMENT  	for 循環語句  break  	用於退出最近一層的 while 或 for 循環  continue  	用於最近一層的 while 或 for 循環提前進入下一輪循環  halt  	結束 bc  return  	從函數中返回 0  return ( EXPRESSION )  	從函數返回表達式 EXPRESSION 的值  limits  	打印 bc 的限制  quit  	結束 bc  warranty  	打印授權注意事項

8.函數

bc 支持函數,定義形式如下:

define [void] NAME ( PARAMETERS ) {  	AUTO_LIST   STATEMENT_LIST }

其中 關鍵字 void 表示函數無返回值,NAME 為函數名,PARAMETERS 為函數參數,AUTO_LIST 為函數內部使用 auto 關鍵字申明的局部變量,STATEMENT_LIST 為函數 bc 語句。

函數調用形式:

NAME(PARAMETERS)

常用的內置函數有:

length ( EXPRESSION )  	數值的有效數字的個數  read ()  	從標準輸入讀取輸入  scale ( EXPRESSION )  	數值小數點後的數字的個數  sqrt ( EXPRESSION )  	求平方根。如果 EXPRESSION 是一個負數,則引發運行時錯誤

如果使用 -l 選項調用 bc,則會預加載一個數學庫,並將默認精度設置為 20。數學庫定義了以下函數:

s (x)  	求正弦值 sin(x),x 的單位是弧度  c (x)  	求餘弦值 cos(),x 的單位是弧度  a (x)  	x 的反正切,反正切返回弧度  l (x)  	x 的自然對數  e (x)  	指數函數,求自然 e 的 x 次冪  j (n,x)  	x 的整數階 n 的貝塞爾函數

9.常用示例

(1)執行浮點運算。

echo "3.141592653 * 3" | bc  9.424777959

(2)指定計算結果的精度。

echo "scale = 2; 3.0/8" | bc  .37    # 輸出小數點前的 0  echo 'scale = 2; a = 3.0/8; if (length(a) == scale(a)) print 0; print a,"n"' | bc  0.37

(3)進制轉換。如將二進制轉換為十進制。

echo "obase=10;ibase=2;00001111" | bc  15

(4)冪運算。

echo "9^2" | bc  81

(5)調用內置函數 sqrt() 計算平方根。

echo "sqrt(16)" | bc  4

(6)交互式進行數學運算。

bc  9+9  18  9*9  81  sqrt(81)  9  quit

參考文獻

[1] bc manual [2]【Linux】一步一步學Linux——bc命令(233)