bc命令詳解


  

基礎命令學習目錄首頁

 

原文鏈接:https://www.cnblogs.com/lovevivi/p/4359296.html

最近經常要在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即可有詳細的解釋。

 

前言
Linux版本:CentOS7.4  64位
這里所有提到的shell都是bash shell,不過推薦你可以學學zsh
Linux Shell進行數值計算的時候,
使用expr,很麻煩,乘號啊什么的還需要轉譯,
使用美刀符($)加中括號,卻只局限於整數計算,
這里介紹一下
Linux的bc命令,它相當於Linux內建的計算器,可以計算整數,也可以進行浮點計算(小數)
你可以叫它bc計算器,也可以叫bash計算器,它就是bash內置的計算器
bc命令的基本用法
你甚至可以把bc稱作一種編程語言,它允許在命令行中輸入浮點表達式,然后解釋並計算該表達式,最后返回結果。bc計算器能夠識別的東東:

數字(整數和浮點數)
變量(簡單變量和數組)
注釋(以#或C語言中的/* */開始的行)
表達式
編程語句
函數

可以直接在命令行使用bc命令:
[dong@cwd shell]$ bc
bc 1.06.95
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'.
12 * 3.14
37.68
8 * 3.14
25.12
quit
1234567891011
上面是bc計算器的歡迎界面,如果你覺得多余可以使用 -q參數把它去掉
浮點數的小數位數是由內建變量scale控制的。
必須將這個值設置為你希望在計算結果中保留的小數位,
否則無法得到期望的結果
[dong@cwd shell]$ bc -q
3.14 /5
0
scale=4
3.14 / 5
.6280
quit
12345678
scala變量的默認值是0
在scala值被設置之前,bc計算結果不包含小數位。
在將其值設置成4后,bc計算器顯示的結果包含4位小數。
-q參數可以不顯示bc計算器冗長的歡迎信息。
除了普通數字,bc計算器還能支持變量
[dong@cwd shell]$ bc -q
var1=10
var1 * 4
40
var2 = var1 / 5
print var2
2
println var2
(standard_in) 6: syntax error
quit
1234567891011
變量一旦被定義,就可以在整個bc 計算器會話中使用該變量了,print語句允許你打印變量和數字。
在腳本中使用bc計算器
現在你可能想問bc計算器是如何在shell腳本中幫助處理小數運算的?
可以采用如下的格式在shell腳本中使用bc命令,並將返回結果賦給一個變量。
基本格式如下:
variable=$(echo "options; expression" | bc)
1
第一部分options允許你設置變量。如果你需要不止一個變量,可以用分號將其分開。
expression參數定義了通過bc執行的數學表達式。
OK,下面來個Demo:
[dong@cwd shell]$ vim create_base_script.sh
#!/bin/bash
# 測試在腳本中使用bc命令
# 可以用命令替換運行bc命令,燕將輸出賦給一個變量,基本格式如下:
# variable=$(echo "options; expression" | bc)
# 第一部分options允許你設置變量。如果你需要不止一個變量,可以用分號將其分開。
# expression參數定義了通過bc執行的數學表達式。這里有個在腳本中這么做的例子。
var1=$(echo "scale=4; 3.44 /5" | bc)
echo The answer is $var1
12345678910
這個例子將scale變量設置成4位小數,並在expression部分指定了特定的運算。運行這個腳本會產生如下輸出:
是不是很神奇啊?
當然除了被賦值,那個變量(var3)也可以用於其他運算了
看下面的例子:
[dong@cwd shell]$ vim create_base_script3.sh
#!/bin/bash
# 在bc命令中測試使用變量
var1=20
var2=3.1415
var3=$(echo "scale=4; $var1 * $var1" | bc)
var4=$(echo "scale=4; $var3 * $var2" | bc)
echo var3 = $var3
echo var4 = $var4
12345678910
代碼截圖及運行結果如下:
這個方法適用於較短的運算,
但是有時你會涉及更多的數字。
如果需要進行大量運算,在一個命令行中列出多個表達式就會有點麻煩。
·怎!么!辦!呢!?
你可以先把Demo敲一遍再看為什么
最好的辦法是使用內聯輸入重定向,
它允許你直接在命令行中重定向數據。
在shell腳本中,你可以將輸出賦給一個變量:
variable=$(bc << EOF
options
statements
expressions
EOF
)
EOF
1234567
文本字符串標識了內聯重定向數據的起止。
記住,仍然需要將bc命令的輸出賦值給變量,
下面來一個例子:
[dong@cwd shell]$ sh create_base_script4.sh 
#!/bin/bash
# 測試bc命令在內聯輸入重定向下的使用
var1=3.14
var2=2.5
var3=16
var4=2.7
var5=$(bc << EOF
scale = 4
a1 = ( $var1 * $var2)
a2 = ($var3 * $var4)
a1 + a2
EOF
)
echo var5 = $var5
1234567891011121314151617
代碼截圖
輸出結果如下:
EOF字符串標識了重定向給bc命令的數據的起止。
當然,必須用美刀符$(xxx)來標識出用來給變量賦值的命令。
---------------------
作者:荒野獨行
來源:CSDN
原文:https://blog.csdn.net/daerzei/article/details/80341339
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!
 
 
一: bc 的基本使用1. 基本運算符運算符與平時所用的 + - * / % 一樣,其中指數運算使用 ^ 運算符。2. 進入 bc 解釋環境#bcbc 1.06.95Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.This is free software with ABSOLUTELY NO WARRANTY.For details type `warranty'.3+5856*78436856^4983449654%54
3. 退出 bc 解釋環境
按Ctrl+D 或者 輸入quit 退出 bc 命令
quit
4. 通過管道使用 bc 命令
將所要計算的 通過echo命令傳遞給bc,如果有多條要執行的,則通過 ; 隔絕開。
#echo "5+3" | bc8#echo "6*5;32/2" | bc3016
5. 其他
如果希望進入 bc 時候沒有前面一大段提示可以開始的時候加入 -q。
#bc -q
二: 使用 bc 進行浮點數運算,進制轉換
1. 浮點運算 -- scale
通過設定 scale 這個變量,可以控制除法,乘冪,取余結果的小數點精度值。scale默認為0,通過輸入scale可以看出當前的值。
scale
03/40scale=13/4.72/3.6
2. 進制轉換 -- ibase obase
ibase,obase 顯而易見一個是輸入進制,一個是輸出進制。默認都是十進制。其中ibase為16的時候,ABCDF必須要大寫,否則無效。
ibase=16ffff0FFFF65535
其他組合功能自己發揮啦。
---------------------
作者:sinat_24543051
來源:CSDN
原文:https://blog.csdn.net/sinat_24543051/article/details/67636778
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!
 
 
原文鏈接:https://blog.csdn.net/sinat_24543051/article/details/67636778
bc 命令是任意精度計算器語言,通常在linux下當計算器用。


它類似基本的計算器, 使用這個計算器可以做基本的數學運算。


常用的運算:
+ 加法
- 減法
* 乘法
/ 除法
^ 指數
% 余數


語法
bc(選項)(參數)


選項值
-i:強制進入交互式模式;
-l:定義使用的標准數學庫
; -w:對POSIX bc的擴展給出警告信息;
-q:不打印正常的GNU bc環境信息;
-v:顯示指令版本信息;
-h:顯示指令的幫助信息。


參數


文件:指定包含計算任務的文件。 


實例
$ bc
bc 1.06.95
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'.
2+3
5
5-2
3
2+3*1
5


輸入 quit 退出。


通過管道符


$ echo "15+5" | bc
20


scale=2 設小數位,2 代表保留兩位:
$ echo 'scale=2; (2.777 - 1.4744)/1' | bc
1.30


bc 除了 scale 來設定小數位之外,還有 ibase 和 obase 來其它進制的運算:
$ echo "ibase=2;111" |bc
7


進制轉換
#!/bin/bash


abc=192 
echo "obase=2;$abc" | bc
<pre>
<p>
執行結果為:11000000,這是用bc將十進制轉換成二進制。</p>




<pre>
#!/bin/bash 


abc=11000000 
echo "obase=10;ibase=2;$abc" | bc


執行結果為:192,這是用bc將二進制轉換為十進制。


計算平方和平方根: 
$ echo "10^10" | bc 
10000000000
$ echo "sqrt(100)" | bc
10

 


免責聲明!

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



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