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)